[英]Why .Net FCL is implementing generic and non-generic interface IList and IList<T> in List<T> class at same time?
[英]Why is the List Class Implementing IList Interface?
我的問題可能會有點愚蠢,但我真的想知道為什么以這樣的方式設計集合層次結構:它包含接口和類,而可能只是類,或者在頂層和其余類中只有一個接口。
有人可以解釋一下原因嗎?
想想,如果僅定義一個IList
接口,則需要類來實現它。 List
只是一種這樣的實現,如果可以的話,默認為實現。
另一方面,如果您只有一個列表作為抽象類(即沒有IList
接口),則所有自定義列表集合類都必須繼承。 我會說這將是一個糟糕的設計選擇,因為IList
的成員更適合合同(單個添加/刪除方法可以具有不同的實現,例如優先級列表等)。 通過將List用作抽象類,可以強制和控制人們的設計選擇。
同樣在C#中,您將另外受到約束,無法從您的自定義集合的任何其他類繼承。
基本上,您應該嘗試查看接口和抽象類提供的不同功能。 這將使您意識到IList和List之間的區別。
每個類只能從一個類派生,而可以從多個接口派生。
為什么我們需要多個接口?
通常,有兩個原因導致我們對一個類擁有多個接口: 1.一類可以具有不同類型的行為 ; 2.開放式原則 。
接口的簡短定義是:接口是一個實體,它確定派生類必須如何行為,並且由於行為的類型不同,因此每個類可能需要不同的接口。
此外,根據SOLID的第二個原則,這是“開放式-封閉式”原則的縮寫,這意味着即使您要向特定類添加新行為(例如CanBark
),實體也必須為擴展而開放,而為修改而封閉。作為類的父類,已經有一個相關的接口( IDogActions
),建議不要修改IDogActions
接口,因為可能還有許多其他類在實現此接口,並且不需要新操作,而是可以創建一個新的接口(例如IDogAuditoryActions
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.