Правильный способ дублирования объекта Delphi

Каковы плюсы и минусы дублирования экземпляра объекта с конструктором или функцией экземпляра?

Пример 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);
21
задан gabr 28 October 2010 в 10:54
поделиться