Форум: ".Net";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];
ВнизКак вызывать виртуальные классовые методы из неклассовых методов? Найти похожие ветки
← →
Игорь Шевченко © (2005-07-06 12:49) [0]Такая ситуация возникла при переносе проекта из 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 разумеется, все работает.
← →
VMcL © (2005-07-06 13:06) [1]>>Игорь Шевченко © (06.07.05 12:49)
Честно говоря, не знаю, как именно в Delphi.NET, но сам .NET (по крайней мере CLS) виртуальные статические (они же классовые) методы не предусматривает, AFAIK.
Но, по идее, можно это дело обойти, воспользовавшись рефлексией.
← →
Игорь Шевченко © (2005-07-06 13:10) [2]VMcL © (06.07.05 13:06) [1]
Вот для этого в Delphi сделаны так называемые Meta-классы, которые появляются при объявлении каждого класса Delphi.Net
← →
VMcL © (2005-07-07 00:40) [3]>>Игорь Шевченко © (06.07.05 13:10) [2]
Тады ой. Я с C# и VB.NET работаю. С Delphi.NET у меня как-то не сложилось.
← →
k2 © (2005-07-07 12:43) [4]перенести из strict protected в protected
пока не разобралась почему, но работает :)
← →
Игорь Шевченко © (2005-07-07 12:46) [5]k2 © (07.07.05 12:43) [4]
Спасибо!! И впрямь работает. А почему - известно должно быть борланду.
О сколько нам открытий чудных
Готовит просвещенья дух
И опыт, сын ошибок трудных
и Borland, Paradox"ов друг.
Страницы: 1 вся ветка
Форум: ".Net";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c