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