我想知道,Delphi 的 RTTI 中是否有任何东西可以像 C# 中的 MemberwiseClone 一样简单地实现原型模式。
我看到了这种模式的一些 Delphi 实现,其中正在创建一个新对象 (TMyObject.Create),并且它的属性分配有来自原型对象的值。我可能是错的,但如果我们以相同的基本方式创建对象,我看不到该模式的好处。
谢谢。
Object.MemberwiseClone 方法使一个shallow遵循一些非常简单的规则并利用 .NET 垃圾收集器的工作方式的对象副本。
- 参考文献只是简单地复制。这包括字符串和对任何内容的引用
object
.
- 值类型是按位复制的(创建相同的克隆)。
关于值类型的部分可以很容易地用 Delphi 复制。使用 Delphi 复制引用类型行为虽然在技术上很容易,但不会提供预期的结果:Delphi 代码预计.free
它创建的对象,并且它使用owner-owned
确保这种情况发生的范例。通常的模式是从析构函数中释放所有者对象创建的对象。如果您对对象进行浅复制,则会导致失败。这是一个例子:
- 对象 A 拥有对对象 B 的引用。
- 我们创建对象 C 作为对象 A 的浅表副本。对象 C 现在包含对对象 B 的引用。
- 我们释放对象 A:
A.Free;
- 我们释放对象 B:
B.Free;
- 这会自动调用B.Free
,但不幸的是,当我们释放 A 时,B 已经被释放了!
我们可以尝试一个deep-copy
正如大卫所建议的,但这也带来了一些同样困难的问题:
- 并非所有对象都应该被复制,例如因为它们封装了对现实世界资源的引用(例如:TFileStream)。
- 其他一些对象无法进行深度复制,因为它们本质上是单例。并且没有通用的方式来表示“这个对象是单例,进行简单的引用复制,不要进行深层复制”。示例:我们复制吗
Application
?
- 如果您进行深层复制,则可能会出现循环引用,您需要处理这些问题。这并不简单,当您从集合中的某个项目开始复制时,您可能会发现自己回到了集合的父级,即:不完全是预期的结果。
- 不加区别的深度应对可能会占用意想不到的内存量并导致意外的内存泄漏。再次考虑集合 -> 项目 -> 复制项目示例,您最终得到“项目”的副本,但由于意外的反向链接,整个 COLLECTION 被复制。
将所有这些放在一起,我们只能得出一个结论:我们不能有一个通用的目的,Delphi 相当于MemberwiseClone
。对于具有不复杂交互的更简单的对象,我们可以有部分相似的外观,但这远没有那么吸引人!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)