Answers:
你不应该 Microsoft建议不要实施,ICloneable
因为在界面上没有明确指示您的Clone
方法是执行“深度”克隆还是“浅”克隆。
有关更多信息,请参阅Brad Abrams于2003年撰写的此博客文章(!)。
该ICloneable
接口本身并不是非常有用,这是说,真的没有很多情况下是非常有用的知道,一个目的是在不知道任何关于它可复制。这与例如IEnumerable
或IDisposable
; 截然不同。在许多情况下,接受一个有用的信息IEnumerable
而不是除枚举它以外的任何事情都是有用的。
另一方面,ICloneable
当与其他约束一起用作一般约束时可能很有用。例如,基类可能有用地支持许多派生类,其中一些可以被有用地克隆,而另一些则不能。如果基本类型本身公开了公共克隆接口,则任何无法克隆的派生类型都将违反Liskov替换原理。避免此问题的方法是让基本类型支持使用Protected方法的克隆,并允许派生类型在合适的情况下实现公共克隆接口。
完成此操作后,可以将想要接受某种WonderfulBase
类型的对象并且需要能够克隆它的方法进行编码,以接受支持克隆的WonderfulBase对象(使用具有基本类型和ICloneable
约束的通用类型参数) 。尽管该ICloneable
接口本身并不表示深克隆或浅克隆,但有关文档WonderfulBase
将指出WonderfulBase
可克隆对象应是深克隆还是浅克隆。本质上,该ICloneable
接口不会完成定义所无法实现的任何事情ICloneableWonderfulBase
,只是它避免为每个不同的可克隆基类定义不同的名称。