2017-06-29 223 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); 
}