Главная страница
    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.009 c
15-1237461652
Baks
2009-03-19 14:20
2009.05.24
Программа для измерения скорости подключения к интернету


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


15-1237385822
Альф
2009-03-18 17:17
2009.05.24
Как выравнять размер exe кратным 4K


4-1203581655
Начинающий
2008-02-21 11:14
2009.05.24
Кто обрабатывает нажатие на кнопку в MessageBox ?


2-1238993664
Alex_C
2009-04-06 08:54
2009.05.24
Как быстрее обратиться к полям таблицы?





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