Главная страница
    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.012 c
1-1120671763
Kulon
2005-07-06 21:42
2005.07.25
Delphi and AutoCAD2004


3-1118830441
stud
2005-06-15 14:14
2005.07.25
помогите с компонентом для отображения текста и картинок (Д7)


4-1117219914
carmen
2005-05-27 22:51
2005.07.25
Как изменить содержимое Edita чужой программы


3-1118343047
Taurus
2005-06-09 22:50
2005.07.25
Данные из БД в WORD


1-1120566147
K
2005-07-05 16:22
2005.07.25
Смежный компонент TreeView и ListView





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