Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
15-1221061690
Tricky_
2008-09-10 19:48
2008.11.02
Удаленная работа, или как заставить программиста работать


2-1222334998
deadteachers
2008-09-25 13:29
2008.11.02
Паук-Робот


15-1221112876
Slider007
2008-09-11 10:01
2008.11.02
С днем рождения ! 11 сентября 2008 четверг


2-1222250546
Нов_и_чок
2008-09-24 14:02
2008.11.02
SQL в Delphi


2-1222447265
AlexDan
2008-09-26 20:41
2008.11.02
Форма..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский