Главная страница
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.016 c
4-1198791694
Elec3C
2007-12-28 00:41
2008.11.02
Проверка BalloonHint


15-1220977765
NailMan
2008-09-09 20:29
2008.11.02
Какой-то батут с Explorer.exe при вызове горячими клавишами


4-1198793355
Domoffou
2007-12-28 01:09
2008.11.02
RichEdit20W - перехват текста


15-1221024724
Vlad Oshin
2008-09-10 09:32
2008.11.02
BDS2006, палитра компонент, как упорядочить внутри вкладки по афл


2-1222246913
pathfinder
2008-09-24 13:01
2008.11.02
Массив объектов как параметр