![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вызывать виртуальные классовые методы из неклассовых методов? [D2005]
Игорь Шевченко © (2005-07-06 12:49:00)Такая ситуация возникла при переносе проекта из Win32 в Vcl.Net -
Есть иерархия из трех форм:
type
TfAsiaWorldMDI = class(TForm)
..//ничего интересного, кроме обработчика OnClose
end;
type
TfAsiaWorldMDIDataView = class(TfAsiaWorldMDI)
procedure FormCreate(Sender: TObject);
strict protected
function GetModel: IAsiaModel;
class function GetModelName: string; virtual;
end;
и
type
TfCountryView = class(TfAsiaWorldMDIDataView)
strict protected
class function GetModelName: string; override;
end;
реализация методов TfAsiaWorldMDIDataView выглядит так:
procedure TfAsiaWorldMDIDataView.FormCreate(Sender: TObject);
begin
inherited;
DataSource.DataSet := GetModel.DataSet;
end;
function TfAsiaWorldMDIDataView.GetModel: IAsiaModel;
begin
Result := ModelList.FindModel(GetModelName);
end;
class function TfAsiaWorldMDIDataView.GetModelName: string;
begin
Result := '';
end;
и реализация метода TfCountryView.GetModelName:
class function TfCountryView.GetModelName: string;
begin
Result := 'COUNTRY';
end;
При попытке создания формы TfCountryView на экран вылезает messagebox с одним словом: @MetaTfAsiaWorldMDIDataView.GetModelName()
и метод TfAsiaWorldMDIDataView.GetModel завершается с ошибкой NullReferenceException
После переделки виртуальных классовых методов в вирутальные неклассовые программа работает нормально, но хотелось бы узнать, как можно использовать именно вирутальные классовые методы в таком вот контексте.
На Win32 разумеется, все работает.
Игорь Шевченко (2005-07-07 12:46:00) [1]k2 © (07.07.05 12:43) [4]
Спасибо!! И впрямь работает. А почему - известно должно быть борланду.
О сколько нам открытий чудных
Готовит просвещенья дух
И опыт, сын ошибок трудных
и Borland, Paradox'ов друг.
k2 (2005-07-07 12:43:00) [2]перенести из strict protected в protected
пока не разобралась почему, но работает :)
VMcL (2005-07-07 00:40:00) [3]>> Игорь Шевченко © (06.07.05 13:10) [2]
Тады ой. Я с C# и VB.NET работаю. С Delphi.NET у меня как-то не сложилось.
Игорь Шевченко (2005-07-06 13:10:00) [4]VMcL © (06.07.05 13:06) [1]
Вот для этого в Delphi сделаны так называемые Meta-классы, которые появляются при объявлении каждого класса Delphi.Net
VMcL (2005-07-06 13:06:00) [5]>> Игорь Шевченко © (06.07.05 12:49)
Честно говоря, не знаю, как именно в Delphi.NET, но сам .NET (по крайней мере CLS) виртуальные статические (они же классовые) методы не предусматривает, AFAIK.
Но, по идее, можно это дело обойти, воспользовавшись рефлексией.