Текущий архив: 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.46 MB
Время: 0.011 c