Вниз
Скачать: CL | DM;

Динамическое создание объектов: правильно ли сделал?   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
1-1201073162
Unknown user
2008-01-23 10:26
2008.11.02
Control has not parent window


13-1122032552
jenbond
2005-07-22 15:42
2008.11.02
Работа с переменной


2-1222147865
vegarulez
2008-09-23 09:31
2008.11.02
Вопрос про хук.


15-1221210821
Ламо777
2008-09-12 13:13
2008.11.02
Flash 3D - ролик "на лету"


1-1201414165
snake-as
2008-01-27 09:09
2008.11.02
Помогите разобраться с ADO




   Наверх