![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание объектов: правильно ли сделал? [D7]
Ega23 © (2008-02-04 12:16:00)Игрался с 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:35:00) [1]Да, еще. Если добавить виртуальный конструктор в класс TMyCustomClass, то все равно будет неправильно. Так как мы вызываем статический конструктор класса TPersistent. Необходимы еще некоторые телодвижения:
TMyCustomClassRef = class of TMyCustomClass;
TMyCustomClassRef(FindClass(...)).Create;
В этом случае будет вызван правильный конструктор.
Семеныч (2008-02-04 12:32:00) [2]Я бы добавил метакласс и виртуальный конструктор. В задачах подобного рода могут очень даже пригодиться.
type
TMyCustomClass = class (TPersistent)
public
procedure DoWork(List : TStrings); virtual;
constructor Create; virtual;
end;
TClassOfTMyCustomClass = class of TMyCustomClass;
...
Ega23 (2008-02-04 12:31:00) [3]
> Если экземпляр создается по классовой ссылке, то конструктор
> должен быть виртуальным.
Всё. Теперь ясно, что меня смущало.
Вопрос снят, Ins - большое спасибо!
Ins (2008-02-04 12:29:00) [4]Если экземпляр создается по классовой ссылке, то конструктор должен быть виртуальным.