为什么要在c#中实现ICloneable?
你能向我解释为什么我应该从ICloneable
inheritance并实现Clone()
方法吗?
如果我想做一个深层次的复制,我不能只实现我的方法? 我们说MyClone()
?
我为什么要inheritanceICloneable
? 有什么优势? 这只是使代码更“可读”吗?
你不应该。 Microsoftbuild议不要实施ICloneable
因为从接口没有明确的指示您的Clone
方法是执行“深层”还是“浅层”克隆。
有关更多信息,请参阅2003年Brad Abrams的博客文章 (!)。
ICloneable
接口本身并不是非常有用,也就是说,实际上并不是很多情况下知道一个对象是可复制的,而不知道其它的东西。 这是一个非常不同的情况,例如IEnumerable
或IDisposable
; 有很多情况下,接受IEnumerable
是有用的,除了如何枚举它之外,什么都不知道。
另一方面,当作为通用约束与其他约束一起应用时, ICloneable
可能是有用的。 例如,一个基类可能会有用地支持一些衍生物,其中一些可能被有用地克隆,而其中一些则不能。 如果基本types本身公开了一个公共克隆接口,那么任何不可克隆的派生types都将违反Liskovreplace原则。 避免此问题的方法是使基types支持使用Protected方法克隆,并允许派生types在他们认为合适的情况下实现公共克隆接口。
一旦完成,一个想要接受WonderfulBase
types的对象并需要克隆它的方法可以被编码为接受一个支持克隆的WonderfulBase对象(使用基types和ICloneable
的genericstypes参数约束)。 尽pipeICloneable
接口本身不会表示深度或浅层克隆,但WonderfulBase
的文档将指示可克隆WonderfulBase
是深度还是浅层克隆。 本质上, ICloneable
接口不会完成任何通过定义ICloneableWonderfulBase
不能完成的任何事情,除非它将避免为每个不同的可复制基类定义不同的名称。
ICloneable
是BCL中那些引起争议的文物之一。 恕我直言,没有真正的原因来执行它。 有了这个说,如果我要创build一个克隆方法,那么我会实现ICloneable
,并提供我自己的强大的Clone
版本。
ICloneable
的问题是从来没有表明,如果Clone
是一个浅或深的副本,是非常不同的东西。 没有ICloneable<T>
的事实可能是微软对ICloneable的看法
马特是正确的,不要使用它。 创build你自己的Copy()
方法(或类似的名字),并在公共API中清楚地说明你的方法是创build对象的深层还是浅层拷贝。