2017-06-29 157 views
0

为了简化我的问题,我使用IListIList<T>作为示例。 由于IList宣布方法Add(object value)IList<T>宣布方法Add(T value)。我的新班级必须有两种实施方法。C#实现接口与泛型重写

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

是否可以避免这种“无意义”复制?

+0

如果您正在实现一个接口(或一组接口),指示您同时需要这两个接口,那么您需要同时声明这两个接口。期。你通常可以实现其中一个,然后让所有其他人调用第一个。 –

+0

您正在实施'IList '和'IList',所以期待重复。它们不是同一个接口 - 一个处理其他标准对象的泛型实现。你可以得到大多数IEnumerable派生的接口,我认为这是由于枚举,但可以记住我的头顶。 –

+1

只要你试图重复15岁的错误,没有。代码是错误的,它必须使用this.Add((T)值)。 –

回答

0

不,你不能避免这一点。因为这会违反界面的原则。考虑一下只适用于IList的客户端程序。这个程序现在想要使用你的课程,当然,因为你实现了IList。所以他称之为方法:

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

现在该怎么办?如果你不实施这个?当然,你可以调用Add<T>来代替,但是如果有很多实现IList的类,并且您在IList接口上调用Add-Method以在引擎盖下使用多态性,则不再有效。

C#在这方面有严格的要求,与我所了解的Interface Concept的其他语言一样。

0

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

0

也许你应该避免实施非通用IList,因为它违反了SOLID,更确切地说是Liskov替代原则。这是来自.Net 1的传统界面,当泛型不可用时。那么如果你正在处理遗留代码,那么可能是必要的。

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

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