Каковы плюсы и минусы дублирования экземпляра объекта с помощью конструктора или функции экземпляра?
Пример A:
type
TMyObject = class
strict private
FField: integer;
public
constructor Create(srcObj: TMyObject); overload;
//alternatively:
//constructor CreateFrom(srcObj: TMyObject);
property Field: integer read FField;
end;
constructor TMyObject.Create(srcObj: TMyObject);
begin
inherited Create;
FField := srcObj.Field;
end;
Пример B:
type
TMyObject = class
strict private
FField: integer;
public
function Clone: TMyObject;
property Field: integer read FField;
end;
function TMyObject.Clone: TMyObject;
begin
Result := TMyObject.Create;
Result.FField := FField;
end;
Одинсразу же возникает важное различие - в последнем случае конструктор Create должен быть виртуальным, чтобы иерархия классов, поддерживающая Clone, могла быть построена на основе TMyObject.
Предположим, что это не проблема - что TMyObject и все, что на нем основано, полностью находится под моим контролем.Какой ваш предпочтительный способ сделать конструктор копирования в Delphi?Какую версию вы считаете более читабельной?Когда бы вы использовали прежний или последний подход?Обсудить.:)
РЕДАКТИРОВАТЬ: Моя основная проблема с первым примером заключается в том, что использование является очень тяжелым по сравнению со вторым подходом, то есть
newObj := TMyObject.Create(oldObj)
против.
newObj := oldObj.Clone;
EDIT2 или «Почему я хочу однострочную операцию»
Я согласен, что Assign является разумным подходом в большинстве случаев.Даже разумно реализовать «конструктор копирования» внутри, просто используя assign.
Обычно я создаю такие копии при многопоточности и передаче объектов через очередь сообщений.Если создание объекта происходит быстро, я обычно передаю копию исходного объекта, потому что это действительно упрощает вопросы владения объектом.
IOW, я предпочитаю писать
Send(TMyObject.Create(obj));
или
Send(obj.Clone);
до
newObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);