我想知道,Delphi的RTTI中是否有与MemberwiseClone在C#中执行相同操作的原型模式的简单实现。 我看到了这个模式的一些Delphi实现,其中正在创建一个新对象(TMyObject.Create),并且它的属性使用原型对象的值进行分配。我可能错了,但如果我们以相同的基本方式创建对象,我看不到模式的好处。
谢谢。
答案 0 :(得分:9)
Object.MemberwiseClone Method根据一些非常简单的规则生成对象的浅副本,并利用.NET垃圾收集器的工作方式。
object
。有关值类型的部分可以使用Delphi轻松复制。使用Delphi复制引用类型行为虽然技术上很简单,但不会提供预期的结果:Delphi代码需要.free
它创建的对象,它使用owner-owned
范例来确保发生这种情况。通常的模式是释放由析构函数中的owner-object创建的对象。如果您制作对象的shalow副本,则会导致失败。这是一个例子:
A.Free;
B.Free;
- 这会自动调用B.Free
,但不幸的是,当我们释放A时,B已经被释放了!我们可以像大卫建议的那样尝试deep-copy
,但这会带来一些同样困难的问题:
Application
?把这些全部放在一起我们只能得出一个结论:我们不能有一般的目的,相当于MemberwiseClone
的Delphi。对于具有简单交互的简单对象,我们可以有类似的外观,但这并不是那么有吸引力!
答案 1 :(得分:6)
没有任何内置功能可以为您执行深度克隆。我相信你可以根据新的RTTI编写一个深度克隆,但我希望它是一项非常重要的工作。
如果您处理的是足够简单的类型,它可以正常工作,但您很容易遇到严峻的挑战。例如,在我的头顶:
您可以通过定义一个基本Clone()
方法来实现原型模式,该方法将RTTI用于简单类型,然后您必须覆盖它以获得更复杂的东西。就个人而言,我会继承TPersistent
并根据Clone()
生成Assign
方法。
答案 2 :(得分:4)
有一种方法可以在Delphi中执行对象的深层复制(克隆)。它适用于最新版本的Delphi(2010及以上版本)。看下面剪下的代码......它实际上很简单,你不需要外部库。您可以在此处找到更多信息:http://www.yanniel.info/2012/02/deep-copy-clone-object-delphi.html
function DeepCopy(aValue: TObject): TObject;
var
MarshalObj: TJSONMarshal;
UnMarshalObj: TJSONUnMarshal;
JSONValue: TJSONValue;
begin
Result:= nil;
MarshalObj := TJSONMarshal.Create;
UnMarshalObj := TJSONUnMarshal.Create;
try
JSONValue := MarshalObj.Marshal(aValue);
try
if Assigned(JSONValue) then
Result:= UnMarshalObj.Unmarshal(JSONValue);
finally
JSONValue.Free;
end;
finally
MarshalObj.Free;
UnMarshalObj.Free;
end;
end;
答案 3 :(得分:1)
我认为你正在寻找类似的东西:http://code.google.com/p/delphilhlplib/source/browse/trunk/Library/src/Extensions/DeHL.Cloning.pas
它仅适用于D2010及以上版本(需要扩展RTTI)。
答案 4 :(得分:1)
我前一段时间发布了一个有点通用的component cloning回答可能有用,虽然它不等同于MemberWiseClone
。早在D5,它就可以在Delphi中运行,我相信,我相信它在D2007中有效。