使用构造函数或实例函数复制对象实例有哪些优缺点?
示例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构建支持克隆的类层次结构。
假设这不是问题——TMyObject及其所有基于它的内容完全由我控制。你怎么做Delphi中的复制构造函数?哪个版本更易读?你什么时候会使用前面或后面的方法?讨论一下 :)
编辑:我对第一个示例的主要担忧是使用与第二个方法相比非常繁重,即
newObj := TMyObject.Create(oldObj)
对比。
newObj := oldObj.Clone;
编辑2或“为什么我想要单行操作”
我同意在大多数情况下使用Assign是合理的方法。甚至可以通过简单地使用assign来内部实现“复制构造函数”。
当我在多线程和通过消息队列传递对象时,通常会创建这样的副本。如果对象创建速度很快,我通常会传递原始对象的副本,因为这真正简化了对象所有权的问题。
换句话说,我更喜欢写以下代码:
Send(TMyObject.Create(obj));
或Send(obj.Clone);
tonewObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);