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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
1-1120817381
serguncho
2005-07-08 14:09
2005.07.25
Упаковка вложенных папок Zlib


1-1120638752
Demidoff
2005-07-06 12:32
2005.07.25
Переворот из книжной в альбомную?


14-1120149670
Soft
2005-06-30 20:41
2005.07.25
Почему в интернет-магазинах не продают нелицензионное ПО? :(


6-1113448443
NikNet
2005-04-14 07:14
2005.07.25
WinSock2 на чистом API без форм! Может у кого заволялось?


9-1113467814
parovoZZ
2005-04-14 12:36
2005.07.25
Техника QuadTree





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