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

Вниз

Создание копии объекта   Найти похожие ветки 

 
pasha_golub ©   (2005-07-07 13:32) [0]

Например, есть такое:

 TBase = class
 ...
 end;

 TAncestor = class(TBase)
  ...
 end;

var
 CObj, AObj: TBase;


Хочу чтобы CObj указывал на объект идентичный AObj (сделать копию).
Пытался сделать так:


var Ref: TClass;
begin
A1 := TAncestor.Create;
Ref := A1.ClassType;
C1 := Ref.Create;
end;


Оно ругается, что несовместим тип TObject & TBase.

Как реализовать?

Зачем нужно. Есть список объектов (TObjectList) все потомки одного класса и все разных типов (в идеале). Требуется создать копию определенного объекта, не выполняя такого рода работу:

If (ObjList[i] is TAncestor1) then ...
else
 If (ObjList[i] is TAncestor2) then ... etc.

Вопрос задан возможно сумбурно, если что всегда готов детализировать. Спасибо.


 
Ega23 ©   (2005-07-07 13:37) [1]

TBase(Ref).Create ?


 
Polevi ©   (2005-07-07 13:37) [2]

C1 := TBase(Ref.Create)


 
TUser ©   (2005-07-07 13:38) [3]

CObj:=TBase(AObj);


 
pasha_golub ©   (2005-07-07 13:43) [4]

TUser ©   (07.07.05 13:38) [3]
Создать копию надо...

Ega23 ©   (07.07.05 13:37) [1]
Polevi ©   (07.07.05 13:37) [2]

А вызовется конструктор нужного класса (TAncestorN.Create) или TBase?

При условии, конечно, что в TBase конструктор виртуальный, а в потомках override.


 
pasha_golub ©   (2005-07-07 13:46) [5]

Класс, токо шо проверил. Работает. Спасибо, мужики. :0)


 
pasha_golub ©   (2005-07-07 13:50) [6]

Ega23 ©   (07.07.05 13:37) [1]
Олег, твой вариант дает исключение.

А вот у Сергея (Polevi) верно.


 
Ega23 ©   (2005-07-07 13:56) [7]

Олег, твой вариант дает исключение.

ага, я уже вижу.
Я так, навскидку написал. Помню, что приводить типы надо...


 
pasha_golub ©   (2005-07-07 13:58) [8]

Ну и славненько, как все-таки хорошо, что есть у кого спросить. Вроде бы и вещь не такая сложная, но чем больше думаешь, тем больше стопоришься.


 
Y   (2005-07-07 14:00) [9]

type
 TBaseClass = class of TBase;

TBaseClass(Ref).Create; // Bызывается конструктор TBaseClass.
                       // Eсли он виртуальный, вызовется
                       // конструктор, соответствующий
                       // фактическому классу Ref
//Ref.Create; // неправильно: вызывается конструктор TObject

PS Введи в базовый класс виртуальную функцию Clone.


 
pasha_golub ©   (2005-07-07 14:12) [10]

Y   (07.07.05 14:00) [9]
PS Введи в базовый класс виртуальную функцию Clone.

Так и сделаю. :0) А говорят телепаты в отпуске. ;0)



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

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.039 c
4-1117142783
Aragon
2005-05-27 01:26
2005.07.25
Scroll


14-1120423282
Knight
2005-07-04 00:41
2005.07.25
Ё-хо!!! У меня погасла иконка "Сетевой кабель не подключен" !!!


1-1120656537
denissoft
2005-07-06 17:28
2005.07.25
MQL4


4-1117218902
JagaJiga
2005-05-27 22:35
2005.07.25
Обвести кнопку на тулбаре чужого окна при наведении мышью


1-1120813202
alex-drob
2005-07-08 13:00
2005.07.25
Как узнать с кокого и по какой адрес в памяти...