复制带构造函数或实例函数的对象实例有什么优点和缺点?正确的复制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;
一个主要区别立即弹簧想到 - 在后一种情况下,创建的构造将具有使得一个类层次结构支撑是虚拟克隆可以基于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);
我会为你的答案投票,但这会破坏你的5,555分。 ;-) 恭喜! – splash 2010-10-28 11:16:04
嗯,我确实想要有一天达到6666 :-) – 2010-10-28 11:24:13
好的,在这里你走! +1 – splash 2010-10-28 11:53:25