C#实现具有泛型类型覆盖的接口

时间:2017-06-29 09:01:38

标签: c# generics interface implements

为了简化我的问题,我使用IListIList<T>作为示例。 自IList声明方法Add(object value)IList<T>声明方法Add(T value)以来。我的新课必须有两种实现方法。

class myList<T> : IList<T>, IList
{
  public void IList.Add(object value)
  {
    this.Add(value as T);
  }
  public void Add(T value)
  {...}
}

是否有可能避免这种无意义的&#34;复制?

3 个答案:

答案 0 :(得分:0)

IList集合存储object个实例,但IList<T>存储特定类型实例。 Add方法对IListIList<T>接口具有不同的签名。因此,您需要声明两种方法。

答案 1 :(得分:0)

不,你不能避免这种情况。因为这会违反接口原则。想想一个只与IList合作的客户端程序。这个程序现在想要使用你的课程,当然这是有效的,因为你实现了IList。所以他称之为方法:

public void IList.Add(object value)
{
  this.Add(value as T);
}

如果你不实现这一点,现在应该怎么办?当然你可以改为调用Add<T>,但是如果有很多类实现IList并且你在IList接口上调用Add-Method来使用多态,那么这将不再适用。

C#在这里是有严格理由的,与我所知道的接口概念的任何其他语言相同。

答案 2 :(得分:0)

也许你应该避免实现非泛型IList,因为它违反了SOLID,更准确地说是Liskov替换原则。当泛型不可用时,它是.Net 1的遗留接口。好吧,如果您正在处理遗留代码,则可能是必要的。

如果必须实现IList,Hans已声明,请使用快速失败的实现:当列表中不允许提供的对象时抛出异常。

void IList.Add(object value)
{
  this.Add((T)value);
}