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

Вниз

RTTI и конструктор класса   Найти похожие ветки 

 
Индеец   (2009-04-11 17:48) [0]

Здравствуйте.
Есть первый класс:
T1=class (TPersistent)
public
constructor create;
...........

У него есть конструктор, в котором выполняется ряд действий.
Есть его наследник
T2=class(T1)
public
constructor create;
.......
constructor T2.create;
begin
inherited;
end;


В неком третьем классе создается экземпляр наследника:

Fobject:Tobject;
......
procedure T3.setnameclass(value: string);
var temp:TPersistentClass;
begin
temp:=GetClass(value);
if temp<>nil then
begin
  if Assigned(FObject) then
    FObject.Free;
   FObject:=temp.create;
 end;
end;

Ему в параметрах передается "T2" и экземпляр этого класса в этом методе успешно создается. Но есть вопрос: почему при
FObject:=temp.create; , где temp уже является `T2` не выполняется конструктор класса T2 ?


 
Григорьев Антон ©   (2009-04-11 18:06) [1]

Для этого нужно, чтобы конструктор был виртуальным, как у TComponent и его наследников, в противном случае компилятор выбирает конструктор по типу переменной temp, а не по её значению. И тип temp должен быть не TPersistentObject, а ссылкой на тот класс, где конструктор уже объявлен виртуальным.


 
Индеец   (2009-04-11 18:17) [2]

Переписал так:
T1=class (TPersistent)
public
constructor create;virtual;
......

T2=class(T1)
public
constructor create;override;
.......
constructor T2.create;
begin
inherited create;
end;


Fobject:Tobject;
......
procedure T3.setnameclass(value: string);
var temp:TPersistentClass;
begin
temp:=GetClass(value);
if temp<>nil then
begin
 if Assigned(FObject) then
   FObject.Free;
  FObject:=temp.create;
end;
end;

но немного не понял как именно надо переписать с
> ссылкой на тот класс, где конструктор уже объявлен виртуальным.

Ведь мы же не знаем какой именно класс будет в temp ? подскажите пожалуйста на примере этого кода


 
Григорьев Антон ©   (2009-04-11 18:47) [3]

Надо объявить тип TT1class = class of T1; и именно его использовать при объявлении temp вместо TPersistentClass.


 
Индеец   (2009-04-11 19:17) [4]

Большое спасибо, разобрался.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
11-1200936173
Ash-911
2008-01-21 20:22
2009.05.24
Добавление пути в дерево


2-1239025952
Dmitrijan
2009-04-06 17:52
2009.05.24
Вопрос от новичка. Деление двух чисел.


15-1237492883
MsGuns
2009-03-19 23:01
2009.05.24
Два украинских ФК в 1/4 финала КУЕФА


2-1239604199
Iriss
2009-04-13 10:29
2009.05.24
сохранение XMLDocument


15-1237811203
немо2
2009-03-23 15:26
2009.05.24
Индексы в msqql2000. Эквивалентны ли такие действия?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский