gpt4 book ai didi

Delphi原型(prototype)模式

转载 作者:行者123 更新时间:2023-12-03 15:15:20 26 4
gpt4 key购买 nike

我想知道,Delphi 的 RTTI 中是否有任何东西可以像 C# 中的 MemberwiseClone 一样简单地实现原型(prototype)模式。我看到了这种模式的一些 Delphi 实现,其中正在创建一个新对象 (TMyObject.Create),并且它的属性分配有来自原型(prototype)对象的值。我可能是错的,但如果我们以相同的基本方式创建对象,我看不到该模式的好处。

谢谢。

最佳答案

Object.MemberwiseClone Method遵循一些非常简单的规则并利用 .NET 垃圾收集器的工作原理,创建对象的副本。

  • 引用文献只是简单地复制。这包括字符串和对任何对象的引用。
  • 值类型是按位复制的(创建相同的克隆)。

关于值类型的部分可以很容易地用 Delphi 复制。使用 Delphi 复制引用类型行为虽然在技术上很简单,但不会提供预期的结果:Delphi 代码应 .free 它创建的对象,并且它使用 owner-owned 范例以确保发生这种情况。通常的模式是从析构函数中释放所有者对象创建的对象。如果您对对象进行浅复制,则会导致失败。这是一个例子:

  • 对象 A 拥有对对象 B 的引用。
  • 我们创建对象 C 作为对象 A 的浅拷贝。对象 C 现在包含对对象 B 的引用。
  • 我们释放对象 A:A.Free;
  • 我们释放对象 B:B.Free; - 这会自动调用 B.Free,但不幸的是,当我们释放 A 时,B 已经被释放了!

正如 David 建议的那样,我们可以尝试深层复制,但这会带来一些同样困难的问题:

  • 并非所有对象都应该复制,例如因为它们封装了对现实世界资源的引用(例如:TFileStream)。
  • 其他一些对象无法进行深度复制,因为它们本质上是单例。并且没有通用的方式来表示“这个对象是单例,进行简单的引用复制,不要进行深层复制”。示例:我们要复制 Application 吗?
  • 如果您进行深层复制,则可能会出现循环引用,您需要处理这些问题。这并不简单,当您从集合中的某个项目开始复制时,您可能会发现自己回到了集合的父级,即:不完全是预期的结果。
  • 不加区别的深度应对可能会占用意外数量的内存并导致意外的内存泄漏。再次考虑集合 -> 项目 -> 复制项目示例,您最终得到“项目”的副本,但由于意外的反向链接,整个 COLLECTION 被复制。

将所有这些放在一起,我们只能得出一个结论:我们无法拥有一个通用的、相当于 MemberwiseClone 的 Delphi 版本。我们可以为具有不复杂交互的更简单的对象提供部分相似的外观,但这远没有那么吸引人!

关于Delphi原型(prototype)模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com