Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.24;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
15-1237909318
Anglosax
2009-03-24 18:41
2009.05.24
Как продать брата?


15-1237570442
Кто б сомневался
2009-03-20 20:34
2009.05.24
Панель управления >> звуки


2-1239268326
anton20vlad
2009-04-09 13:12
2009.05.24
Как соединить два динамических массива?


15-1237445511
Дмитрий С
2009-03-19 09:51
2009.05.24
Как узнать атрибуты файла в php


15-1236982065
вопро про кладовку
2009-03-14 01:07
2009.05.24
А что с кладовкой? Ничего не скачать, не посмотреть нельзя.