1

我尝试创建一个继承 System.ICloneable 接口但 Clone() 方法的返回类型为 T 的通用接口。当然,T 类型需要约束以确保它是 System.Object 类的继承,但是以下代码不起作用。

public interface ICloneable<T> : System.ICloneable where T : object {

   T Clone ();

}

我究竟做错了什么?

以下约束也不起作用:

  1. 其中 T : System.Object
  2. 其中 T :类

在这种情况下,我如何使用 Liskov 原则来缩小返回类型来解决这个问题?

PS:对不起我的英语,如果我犯了错误。我不是以英语为母语的人。

4

1 回答 1

5

为什么你需要一个约束?一切都继承自object...

如果没有约束,您的代码应该可以工作,但您需要以与/工作Clone相同的方式实现这两种方法- .NET 没有协变返回类型。然后,您还应该指定您的方法将其隐藏在:IEnumerableIEnumerable<T>CloneICloneable

public interface ICloneable<T> : ICloneable
{
    new T Clone();
}

请注意,当前ICloneable界面有些过时 - 因为它没有给出克隆深度的指示,所以在大多数情况下它并不是非常有用。

你真的需要扩展非泛型类型吗?您是否希望用户想要使用非通用接口以及您的通用接口?

于 2009-07-15T12:11:44.430 回答