通用ICloneable<T>不存在有什么特殊的原因吗?
如果我不需要在每次克隆东西的时候都强制使用它,那会舒服得多。
发布于 2009-02-11 11:16:45
ICloneable现在被认为是一个糟糕的应用编程接口,因为它没有指定结果是深度复制还是浅复制。我认为这就是为什么他们没有改进这个界面的原因。
您也许可以使用类型化克隆扩展方法,但我认为它需要一个不同的名称,因为扩展方法的优先级低于原始方法。
发布于 2009-02-11 11:19:22
除了安德烈的回答(我同意,+1) -当ICloneable完成时,你也可以选择显式实现来让公共Clone()返回一个类型化的对象:
public Foo Clone() { /* your code */ }
object ICloneable.Clone() {return Clone();}当然,泛型ICloneable<T>继承还有第二个问题。
如果我有:
public class Foo {}
public class Bar : Foo {}我实现了ICloneable<T>,那么我要实现ICloneable<Foo>吗?ICloneable<Bar>?你很快就会开始实现很多相同的接口...与演员阵容相比。情况真的那么糟糕吗?
发布于 2012-02-25 10:03:47
我需要问的是,除了实现接口之外,您还会对接口做什么?接口通常只在你强制转换(即这个类支持'IBar'),或者有接受它的参数或设置器(即我接受'IBar')时才有用。使用ICloneable -我们浏览了整个框架,但除了它的实现之外,在任何地方都找不到一个单独的用法。我们也没有在“现实世界”中找到除了实现它之外的任何用途(在我们可以访问的大约60,000个应用程序中)。
现在,如果你只是想强制执行一个你想让你的“可克隆”对象实现的模式,这是一个非常好的用法--继续吧。你也可以决定“克隆”对你来说到底是什么意思(即深还是浅)。然而,在这种情况下,我们( BCL)没有必要定义它。只有当需要在不相关的库之间交换类型化为抽象的实例时,我们才在BCL中定义抽象。
David Kean (BCL团队)
https://stackoverflow.com/questions/536349
复制相似问题