你能解释一下为什么我应该继承ICloneable
并实现这个Clone()
方法吗?
如果我想做一个深层复制,我不能只实现我的方法吗?我们说吧MyClone()
?
我为什么要继承ICloneable
?有什么好处?这只是让代码"更具可读性"的问题吗?
你不应该.Microsoft建议不要实现,ICloneable
因为接口没有明确指示您的Clone
方法是执行"深度"还是"浅层"克隆.
有关详细信息,请参阅2003年布拉德艾布拉姆斯的这篇博文(!).
该ICloneable
接口本身并不是非常有用,这是说,真的没有很多情况下是非常有用的知道,一个目的是在不知道任何关于它可复制.这与eg IEnumerable
或IDisposable
; 是完全不同的情况; 有很多情况下接受一个IEnumerable
不知道除了如何枚举之外的任何东西是有用的.
另一方面,ICloneable
当作为通用约束与其他约束一起应用时可能是有用的.例如,基类可能有用地支持许多衍生物,其中一些可以被有效地克隆,而其中一些则不能.如果基类型本身暴露了公共克隆接口,那么任何无法克隆的衍生类型都会违反Liskov替换原则.避免此问题的方法是使用Protected方法使基类型支持克隆,并允许派生类型在他们认为合适时实现公共克隆接口.
一旦完成,一个想要接受一个WonderfulBase
类型的对象并且需要能够克隆它的方法可以被编码为接受支持克隆的WonderfulBase对象(使用具有基类型和ICloneable
约束的泛型类型参数) .尽管ICloneable
界面本身并不表示深度或浅层克隆,但文档中的文档WonderfulBase
表明克隆是否WonderfulBase
应该是深度克隆还是浅克隆.本质上,ICloneable
接口不会完成通过定义无法完成的任何事情ICloneableWonderfulBase
,除了它将避免必须为每个不同的可克隆基类定义不同的名称.
ICloneable
BCL中的其中一件产品一直备受争议.恕我直言,没有真正的理由来实施它.有了这个说如果我要创建克隆方法然后我实现ICloneable
,我提供自己的强类型版本Clone
.
问题ICloneable
是它是否从未表明Clone
是浅层还是深层复制是非常不同的东西.事实上,没有ICloneable
可能表明微软对ICloneable的看法
马特是对的,不要用它.创建您自己的Copy()
方法(或类似名称),并在您的公共API中清楚地表明您的方法是创建对象的深层还是浅层副本.