delphi原型模式

ele*_*tor 4 delphi design-patterns delphi-2007 prototype-pattern

我想知道,Delphi的RTTI中是否有与MemberwiseClone在C#中执行相同操作的原型模式的简单实现.我看到了这个模式的一些Delphi实现,其中正在创建一个新对象(TMyObject.Create),并且它的属性使用原型对象的值进行分配.我可能错了,但是如果我们以相同的基本方式创建对象,我看不到模式的好处.

谢谢.

Cos*_*und 9

Object.MemberwiseClone Method按照一些非常简单的规则生成对象的浅表副本,并利用.NET垃圾收集器的工作方式.

  • 简单地复制参考文献.这包括字符串和任何引用object.
  • 值类型是位复制的(制作相同的克隆).

关于值类型的部分可以使用Delphi轻松复制.使用Delphi复制引用类型行为虽然技术上很简单,但不会提供预期的结果:Delphi代码应该是.free它创建的对象,它使用owner-owned范例来确保发生这种情况.通常的模式是释放由析构函数中的owner-object创建的对象.如果您制作对象的shalow副本,则会导致失败.这是一个例子:

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

deep-copy正如大卫所说,我们可以尝试一下,但这会带来一些同样困难的问题:

  • 并非所有对象都应该被复制,例如因为它们封装了对真实世界资源的引用(例如:TFileStream).
  • 其他一些对象不能被深层复制,因为它们是单身的.并且没有通用的方式说"这个对象是一个单例,做一个简单的引用副本,不做深度复制".示例:我们复制Application吗?
  • 如果你做了深层复制,你可能有循环引用,你需要处理那些.这不是微不足道的,并且您从集合中的项目开始复制,您可能会发现自己回到了集合的父级,即:不完全是预期的结果.
  • 不加选择的深层处理可能会占用意外数量的内存并导致意外的内存泄漏.再想想集合 - >项目 - >复制项目示例,最后得到"项目"的副本,但由于意外的反向链接而复制了整个COLLECTION.

把这一切放在一起我们只能得出一个结论:我们不能有一个通用的目的,相当于Delphi MemberwiseClone.对于具有简单交互的简单对象,我们可以有类似的外观,但这并不是那么有吸引力!


Dav*_*nan 6

内置任何内容都不会为您执行深度克隆.我相信你可以根据新的RTTI写一个深度克隆,但我希望它是一项非常重要的工作.

如果您处理的是足够简单的类型,它可以正常工作,但您很容易遇到严峻的挑战.例如,在我的头顶:

  • 需要以特定顺序创建某些对象组.
  • 不应克隆某类成员,例如引用计数.你如何认识那些有RTTI的人?
  • 你如何对待单身人士?
  • 那些需要建立的外在参考怎么样?假设您克隆了通常由工厂创建的对象.如果该工厂拥有对其创建的对象的引用,那么它背后可能会破坏您的设计.

您可以通过定义一个Clone()将RTTI用于简单类型的基本方法来实现原型模式,然后您必须覆盖它以获得更复杂的东西.就个人而言,我会继承TPersistent并制作我的Clone()方法Assign.