Каковы плюсы и минусы дублирования экземпляра объекта с конструктором или функцией экземпляра?
Пример 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? Какую версию вы считаете более читаемой? Когда вы будете использовать прежний или последний подход? Обсудить.:)
EDIT: Моя главная проблема с первым примером заключается в том, что использование очень тяжело по сравнению со вторым подходом, то есть
newObj := TMyObject.Create(oldObj)
против.
newObj := oldObj.Clone;
EDIT2 или "Почему мне нужна однострочная операция"
Я согласен с тем, что Assign - разумный подход в большинстве случаев. Даже разумно реализовать "конструктор копирования" внутри, просто используя назначение.
Обычно я создаю такие копии при многопоточности и передаче объектов через очередь сообщений. Если создание объекта происходит быстро, я обычно передаю копию исходного объекта, потому что это действительно упрощает проблемы владения объектами.
IOW, я предпочитаю писать
Send(TMyObject.Create(obj));
или
Send(obj.Clone);
к
newObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);