2014-03-06 79 views
1

在.NET Framework 3.5(C#3.0)中,爲什麼System.Hashtable實現了ICollectionIEnumerable當它已經實現IDictionary繼承這兩個接口?爲什麼Hashtable實現ICollection和IEnumerable?

+1

http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx – BlackBear

+0

該鏈接回答了與我的問題相關的所有內容。謝謝BlackBear。 – Tomas

回答

0

由於直接基類的HashtableSystem.Object它實現了無接口,接口重新實現不能與此有關。

由於 IDictionary不隱藏任何它從 IEnumerable繼承部件(例如,它不聲明 new方法 GetEnumerator()),得到爲具有相同名稱的部件不同的實現也可以不是原因。

既然「慣常」的原因都不適用,我認爲Hashtable沒有特別的原因。

編輯:

不知道這是連一個答案。

上面的陳述其實是錯誤的。非通用IDictionary類型確實隱藏它從它的基本接口(非通用)IEnuemrable之一繼承的成員(超載)GetEnumerator()。但不知道這是相關的。請參閱Hashtableherehere中的兩個實現。

新編輯:

其實,如果你查看源代碼(發現如here),你看到的只是:

public class Hashtable : IDictionary, ISerializable, IDeserializationCallback, ICloneable 

但作爲一個線程寫入an answer已鏈接到由Henrik在編譯後的IL中發表了一個評論,所有的基本接口仍然被明確列出。因此,從編譯程序集中的IL轉換到僞C#的反編譯器無法區分這種差異。


最終加入:

我真的想拿出涉及接口重新實現的情況下,如果你也給了一個已經指定派生接口的基礎接口會的問題,但我不認爲有任何存在。這是我的嘗試:

​​

但結果不是一個例子。即使只爲Elephant指定IDerived,也會重新實現所有接口,包括IBase。只有在Elephant既不指定IDerived也不指定IBase時,纔會重新執行壓制。

所以默特的答案和相關的答案是正確的,我的觀點有點偏離主題。我會離開這個帖子讓其他人學習,即使它與提出的問題沒有嚴格的相關性。

2

說完這些intefaces:

interface IFoo1 {...} 

interface IFoo2: IFoo1{...} 

有如下之間的編纂方面沒有差別:

class MyClass: IFoo2{...} 

class MyClass: IFoo2, IFoo1{...} 

第二個聲明使得它更清楚開發商所有接口MyClass的類實現。因此,查看文檔並查看MyClass實現IFoo1接口更容易,而無需挖掘IFoo2接口。

相關問題