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

Вниз

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

 
Юрий Федоров ©   (2003-08-14 17:13) [0]

Добрый день.
Хочу создать копию объекта.
Объект-источник на самом деле является потомком от TMyClass.
Пишу так :

function TMyClass.CreateCopy: TMyClass;
begin
Result:=TMyClass(ClassType.NewInstance);
Result.Create(список параметров);
Result.Assign(Self);
end;


Вопрос:
можно ли так писать? У меня подозрение, что
Result.Create повторно вызовет NewInstance и это приведет к двойному выделению памяти


 
reonid ©   (2003-08-14 17:15) [1]

Не приведёт.
Конструктор вызовется как простой метод


 
Marser ©   (2003-08-14 18:02) [2]

Для использования Assign клас должен быть потомком TPersistent.


 
Игорь Шевченко ©   (2003-08-14 18:06) [3]

Marser © (14.08.03 18:02)

Или у него должен быть свой собственный метод Assign :)))


 
Юрий Федоров ©   (2003-08-14 18:09) [4]

У меня собственный :-)


 
vuk ©   (2003-08-14 18:41) [5]

Если конструктор не виртуальный, то вызовется конструктор TMyClass, что при вызове метода в потомках может вызвать неверную инициализацию. А если конструктор виртуальный, то не понятно, зачем нужен явный вызов NewInstance.


 
Юрий Федоров ©   (2003-08-14 18:48) [6]

>>vuk © (14.08.03 18:41) [5]
Конструктор разумеется виртуальный.
Насчет явного вызова - NewInstance -
я не знаю, конструктор для какого класса вызывать. То есть нужно вызвать конструктор для моего текущего класса, но...
Конструктор, вызванный через ClassType не принимает параметров, а у меня они есть. Попытка типизировать успехом не увенчалась.
Вообще-то похоже, что так можно, очень похожая вещь написана в Application.CreateForm


 
vuk ©   (2003-08-14 18:52) [7]


type
TMyClassRef = class of TMyClass;
...
function TMyClass.CreateCopy: TMyClass;
begin
Result := TMyClassRef(Self.ClassType).Create({params});
end;


 
Юрий Федоров ©   (2003-08-14 19:06) [8]

>>vuk © (14.08.03 18:52) [7]
Да уж... Видимо когда я проверял этот вариант, конструктор еще виртуальным не был, и я запомнил что мне что-то не понравилось.
Впрочем ясно одно - пора пойти попить пивка и отдохнуть :-)


 
vuk ©   (2003-08-14 19:27) [9]

>конструктор еще виртуальным не был
Ну так если конструктор не виртуальный, то что в первом варианте, что во втором, результат один будет.


 
хм ©   (2003-08-14 19:33) [10]


function Clone(obj:TObject):TObject;
var Size:Cardinal;
begin
if Assigned(obj) then
begin
Size:=Obj.InstanceSize;
GetMem(Pointer(Result),Size);
CopyMemory(Pointer(result),Pointer(obj),Size);
Result.AfterConstruction;
end
else Result:=nil;
end;


 
vuk ©   (2003-08-14 19:43) [11]

to хм:
Вот так уж точно не стоит. С таким подходом можно нарваться на разные нехорошие эффекты, связанные с внутренним функционированием экземпляров разных (вложенные объекты, различные нотификации и счетчики ссылок).


 
vuk ©   (2003-08-14 19:45) [12]

>экземпляров разных
должно быть "экземпляров разных классов"


 
хм ©   (2003-08-14 19:54) [13]

Ну у меня инициализация вложенных объектов в AfterConstruction всегда.


 
Camus ©   (2003-08-14 20:07) [14]

> хм © (14.08.03 19:54) [13]

А счетчики ссылок строковых полей Вы тоже увеличиваете вручную?


 
default ©   (2003-08-14 21:16) [15]

Camus © (14.08.03 20:07) [14]
да ерунда такое копирование)


 
хм ©   (2003-08-14 21:42) [16]

>Camus © (14.08.03 20:07) [14]
На универсальность не претендую.


 
vuk ©   (2003-08-14 21:45) [17]

to хм:
>На универсальность не претендую.
Зато на кучу багов - легко.


 
хм ©   (2003-08-14 21:51) [18]

>vuk © (14.08.03 21:45) [17]
Претендую, но их нету.


 
vuk ©   (2003-08-14 21:53) [19]

to хм:
>Претендую, но их нету.
Вы предлагаете (как универсальное) решение, которое работает только в ограниченном количестве случаев. Что Вы на баги не нарвались - Ваше исключительное везение.


 
хм ©   (2003-08-14 21:58) [20]

>vuk © (14.08.03 21:53) [19]
>Вы предлагаете (как универсальное) решение ...

>хм © (14.08.03 21:42) [16]
>На универсальность не претендую.


 
vuk ©   (2003-08-14 22:02) [21]

Звиняюсь, немного уже крыша к вечеру съезжает. :o)
Но тогда неуниверсальность и условия работоспособности кода надо было сразу оговаривать.


 
Юрий Зотов ©   (2003-08-14 23:13) [22]

> хм © (14.08.03 21:51) [18]
> Претендую, но их нету.

Точнее было бы сказать - пока они не проявились. А уж есть они, или их нет - это неизвестно.


 
хм ©   (2003-08-15 00:37) [23]

У меня ни в одном объекте стрингов нет. Все остальное инициализуется в AfterConstruction.

p.s Может хватит, а?



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

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

Наверх




Память: 0.52 MB
Время: 0.015 c
3-81590
led
2003-07-29 18:35
2003.08.25
Поле Memo вывести на грид


14-81908
DeMoN-777
2003-08-07 09:08
2003.08.25
Вроде вопрос по php.ini


1-81700
dez
2003-08-11 10:51
2003.08.25
Вставка Bitmap в Word


14-81962
Till
2003-08-06 09:43
2003.08.25
Конкретный прикол!!!!!


3-81566
Ромн
2003-07-30 16:32
2003.08.25
Сообщение об ошике BDE