2017-01-19 77 views
1

任何人都可以解釋我爲什麼不從IList繼承?我在這裏看到很多輸入,如果我需要爲我的對象提供自定義集合類,而不是從IList中繼承,那麼最好從Collection繼承。這是爲什麼?爲什麼人們說不從IList繼承?如果可能的話,請舉個例子。從列表或集合繼承

我看到它可能喜歡這個,爲什麼不把它作爲列表提供更多的功能:

class FootballTeam : List<FootballPlayer> 
{ 
} 
+0

如果你需要一些自定義功能,那麼你需要從IList接口實現,在這種情況下,你必須實現接口的所有方法,但在提供的代碼片段中,你只是添加兩個屬性到列表因此兩個實現根據要求不同。從IList繼承向集合中添加兩個屬性是不值得實現的。 –

+0

** [收藏指南](https://msdn.microsoft.com/en-us/library/dn169389(v = vs.110).aspx)** – Plutonix

+0

請參閱[爲什麼不從列表繼承?]( http://stackoverflow.com/q/21692193/719186) – LarsTech

回答

2

最好不要做這一切,它像

class FootballTeam 
{ 
    public string TeamName; 
    public int RunningTotal 
    public IList<FootballPlayer> Players 
} 

建模你通常如果您想實現像DiskCachedCollection之類的新類集合,則繼承集合

這被稱爲「構成對繼承」https://en.wikipedia.org/wiki/Composition_over_inheritance

很明顯,爲什麼當一個新的需求變得很長時......「我們想跟蹤一個團隊的管理人員」。突然間,你會哼哼,一個團隊怎麼能成爲一個球員和管理集合的集合。哦!它不是,一個團隊由玩家和管理層組成

-1

如果您要定製其具體實現List或Collection不提供的List或Collection接口,那麼請執行IList或ICollection接口,否則使用任何列表或集合「構成比繼承更好」。

4

overview of collection interface.

這並不提供直接的答案,可能有概述

IList的爲您提供了實現此功能的靈活性。

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable 
{ 
    T this[int index] { get; set; } 

    int IndexOf(T item); 
    void Insert(int index, T item); 
    void RemoveAt(int index); 
} 

如果你使用class FootballTeam : List<FootballPlayer>你能程度 在FootballTeam類的屬性。

理想情況下,您需要擴展您的收藏時。假設你有實現AddSort(T項),然後class FootballTeam : List<FootballPlayer>

如果你使用class FootballTeam : ILIst<FootballPlayer>你可能 重新發明輪子Add(),並Contains()應該由自己來實現

我會推薦使用Composition over inheritance

class FootballTeam : //So here can use any team base class or anything necessary 
{ 
    public string TeamName; 
    public int RunningTotal 

    private List<FootballPlayer> _players 
    public IEnumerable<FootballPlayer> Players {get;set;} 
} 

更新 我已經更新了IEnumerable的Players,所以會有很大的靈活性。

+0

還有兩個問題:1)如果我想使用字典呢?也作爲課堂中的財產? 2)所以如果你說使用組合更好,但是在哪種情況下創建額外的集合類並從List或Collection繼承而不是組合繼承更好? – Arie

+0

繼承的構成基於需求。想想你想要一個集合的場景,你需要一個特定的邏輯,然後你需要擴展(實現)你的班級中的列表。對於正常情況下喜歡代表一個類更好地使用組合 – Eldho

+0

@Arie我有更新的信息,我認爲它會解決你的問題上的評論 – Eldho