Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.02;
Скачать: 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 вся ветка

Текущий архив: 2008.11.02;
Скачать: CL | DM;

Наверх




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


2-1222171076
Nick87
2008-09-23 15:57
2008.11.02
перерисовка combobox


15-1220905107
Riply
2008-09-09 00:18
2008.11.02
Просмоторщик lib файлов.


1-1201861006
Still Swamp
2008-02-01 13:16
2008.11.02
Обшуршивание компонент на предмет строк


11-1194706878
matroskin66
2007-11-10 18:01
2008.11.02
Несколько форм в dll