为了简化我的问题,我使用IList
和IList<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;复制?
答案 0 :(得分:0)
IList
集合存储object
个实例,但IList<T>
存储特定类型实例。 Add
方法对IList
和IList<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);
}