在.NET Framework 3.5(C#3.0)中,爲什麼System.Hashtable
實現了ICollection
和IEnumerable
當它已經實現IDictionary
繼承這兩個接口?爲什麼Hashtable實現ICollection和IEnumerable?
回答
由於直接基類的Hashtable
是System.Object
它實現了無接口,接口重新實現不能與此有關。
由於
IDictionary
不隱藏任何它從
IEnumerable
繼承部件(例如,它不聲明
new
方法
GetEnumerator()
),得到爲具有相同名稱的部件不同的實現也可以不是原因。
既然「慣常」的原因都不適用,我認爲Hashtable
沒有特別的原因。
編輯:
不知道這是連一個答案。
上面的陳述其實是錯誤的。非通用IDictionary
類型確實隱藏它從它的基本接口(非通用)IEnuemrable
之一繼承的成員(超載)GetEnumerator()
。但不知道這是相關的。請參閱Hashtable
here和here中的兩個實現。
新編輯:
其實,如果你查看源代碼(發現如here),你看到的只是:
public class Hashtable : IDictionary, ISerializable, IDeserializationCallback, ICloneable
但作爲一個線程寫入an answer已鏈接到由Henrik在編譯後的IL中發表了一個評論,所有的基本接口仍然被明確列出。因此,從編譯程序集中的IL轉換到僞C#的反編譯器無法區分這種差異。
最終加入:
我真的想拿出涉及接口重新實現的情況下,如果你也給了一個已經指定派生接口的基礎接口會的問題,但我不認爲有任何存在。這是我的嘗試:
但結果不是一個例子。即使只爲Elephant
指定IDerived
,也會重新實現所有接口,包括IBase
。只有在Elephant
既不指定IDerived
也不指定IBase
時,纔會重新執行壓制。
所以默特的答案和相關的答案是正確的,我的觀點有點偏離主題。我會離開這個帖子讓其他人學習,即使它與提出的問題沒有嚴格的相關性。
說完這些intefaces:
interface IFoo1 {...}
interface IFoo2: IFoo1{...}
有如下之間的編纂方面沒有差別:
class MyClass: IFoo2{...}
class MyClass: IFoo2, IFoo1{...}
第二個聲明使得它更清楚開發商所有接口MyClass的類實現。因此,查看文檔並查看MyClass實現IFoo1接口更容易,而無需挖掘IFoo2接口。
- 1. 爲什麼ArrayList實現IList,ICollection,IEnumerable?
- 2. 爲什麼ICollection <T>實現IEnumerable <T>和IEnumerable
- 3. 在ICollection中實現IEnumerator和IEnumerable
- 4. WhereSelectArrayIterator爲什麼沒有實現ICollection?
- 5. 集合<T>:它爲什麼既實現IEnumerable又實現IEnumerable <T>?
- 6. Hashtable實現
- 7. 爲什麼Hashtable不是PascalCase?
- 8. 什麼是ICollection?
- 9. 爲什麼這個類不需要實現IEnumerable?
- 10. 爲什麼TreeNodeCollection不能實現IEnumerable <TreeNode>?
- 11. 爲什麼String類在便攜庫中實現IEnumerable <char>?
- 12. 爲什麼IEnumerable <T>實現Add(T)?
- 13. C++/CLI IEnumerable和IEnumerator實現
- 14. 在IEnumerable擴展中 - 爲什麼只有Count()爲ICollection進行了優化?
- 15. 在NHibernate中使用IList,IEnumerable,ISet或ICollection有什麼區別?
- 16. 瞭解ICollection實現和接口
- 17. 如何轉換ICollection至IEnumerable?
- 18. 鑄造的IEnumerable到ICollection的
- 19. Chunk IEnumerable/ICollection Class C#2.0
- 20. Datatable實現IEnumerable?
- 21. C++ HashTable對象實現
- 22. 爲什麼AbstractCollection實現了Iterable和Collection?
- 23. C#IEnumerable的實現
- 24. 如何實現IEnumerable?
- 25. 實現IEnumerable。錯誤。
- 26. 爲什麼ICollection不包含Add方法?
- 27. 爲什麼System.Net.Mail.MailMessage實現IDisposable
- 28. 爲什麼javax.servlet.GenericServlet實現javax.servlet.ServletConfig?
- 29. Enumerable.Range爲什麼實現IDisposable?
- 30. 爲什麼ServiceReference實現Comparable?
http://blogs.msdn.com/b/ericlippert/archive/2011/04/04/so-many-interfaces.aspx – BlackBear
該鏈接回答了與我的問題相關的所有內容。謝謝BlackBear。 – Tomas