【发布时间】:2011-05-01 19:16:24
【问题描述】:
用构造函数或实例函数复制对象实例的优缺点是什么?
示例 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 构造函数必须是虚拟的,以便可以基于 TMyObject 构建支持 Clone 的类层次结构。
假设这不是问题 - 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);
【问题讨论】:
标签: delphi constructor copy-constructor