Главная страница
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.022 c
15-1220940925
Ламо777
2008-09-09 10:15
2008.11.02
3D в вебе


3-1208684818
Pilum
2008-04-20 13:46
2008.11.02
Каковы сравнительные преимущества FB/IB и MySql в разработке MU?


2-1222234434
Neket
2008-09-24 09:33
2008.11.02
Проверка на ввод нечисловых символов и запятой.


15-1220853849
Slider007
2008-09-08 10:04
2008.11.02
С днем рождения ! 8 сентября 2008 понедельник


2-1222367999
SveTTT
2008-09-25 22:39
2008.11.02
2 запроса в одном