Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание объектов: правильно ли сделал? Найти похожие ветки
← →
Ega23 © (2008-02-04 12:16) [0]Игрался с TPersistent и FindClass.
unit uCustomClasses;
interface
uses SysUtils, Classes;
type
TMyCustomClass = class (TPersistent)
public
procedure DoWork(List : TStrings); virtual;
end;
TMyFirstClass = class (TMyCustomClass)
public
procedure DoWork(List : TStrings); override;
end;
TMySecondClass = class (TMyCustomClass)
public
procedure DoWork(List : TStrings); override;
end;
implementation
{ TMyCustomClass }
procedure TMyCustomClass.DoWork(List : TStrings);
begin
List.Add("TMyCustomClass.DoWork");
end;
{ TMyFirstClass }
procedure TMyFirstClass.DoWork(List : TStrings);
begin
inherited;
List.Add("TMyFirstClass.DoWork");
end;
{ TMySirstClass }
procedure TMySecondClass.DoWork(List : TStrings);
begin
inherited;
List.Add("TMySecondClass.DoWork");
end;
initialization
RegisterClass(TMyFirstClass);
RegisterClass(TMySecondClass);
end.
Соответственно, вызов:
procedure TForm1.Button1Click(Sender: TObject);
begin
With TMyCustomClass(FindClass(Edit1.Text).Create) do
begin
try
DoWork(Memo1.Lines);
finally
Free;
end;
end;
end;
Собственно, смущает вот это:
TMyCustomClass(FindClass(Edit1.Text).Create)
Работает, но как-то не по себе немного от такой конструкции. В чём тревога - словами пока объяснить не могу. Но что-то тут настораживает...
← →
Ins © (2008-02-04 12:29) [1]Если экземпляр создается по классовой ссылке, то конструктор должен быть виртуальным.
← →
Ega23 © (2008-02-04 12:31) [2]
> Если экземпляр создается по классовой ссылке, то конструктор
> должен быть виртуальным.
Всё. Теперь ясно, что меня смущало.
Вопрос снят, Ins - большое спасибо!
← →
Семеныч (2008-02-04 12:32) [3]Я бы добавил метакласс и виртуальный конструктор. В задачах подобного рода могут очень даже пригодиться.
type
TMyCustomClass = class (TPersistent)
public
procedure DoWork(List : TStrings); virtual;
constructor Create; virtual;
end;
TClassOfTMyCustomClass = class of TMyCustomClass;
...
← →
Ins © (2008-02-04 12:35) [4]Да, еще. Если добавить виртуальный конструктор в класс TMyCustomClass, то все равно будет неправильно. Так как мы вызываем статический конструктор класса TPersistent. Необходимы еще некоторые телодвижения:
TMyCustomClassRef = class of TMyCustomClass;
TMyCustomClassRef(FindClass(...)).Create;
В этом случае будет вызван правильный конструктор.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c