2008-12-08 64 views
8

最近,我使用了一個繼承自集合的類,而不是在集合中實例化集合,這是否可以接受,還是會在未來的路上創建看不見的問題?下面清楚起見例子:將集合作爲屬性與類的類與類繼承集合

public class Cars : List<aCar> 

,而不是像這樣:

public class Cars 
{ 
List<aCar> CarList = new List<aCar>(); 
} 

有什麼想法?

回答

10

問題在於你的Cars類仍然有它從List繼承的接口,它可能允許你不想要的操作。

6

這取決於你班級的最終目的。如果它只是作爲你自己的集合實現來使用繼承。如果沒有,請將集合包含爲屬性。第二種選擇是更通用:

  • 正如你只能從一個類繼承,則可能如果你需要看到這個類作爲一個集合可以包含一個需要從另一個類繼承,而不是收集
  • 索引器屬性。
4

我誤解了以前的問題。

我會建議使用組合而不是繼承。如果你想能夠使用所有時髦的LINQ的東西,通過一切手段實現IEnumerable<T>甚至IList<T> - 但我不會直接從List<T>派生。

如果你想要獲得收集東西「免費」,但仍然保留控制權,你可以使用CollectionBase。在繼承方面,這仍然會使你失望,但至少你可以更好地控制集合中發生的事情。

3

如果你想讓你的Cars類像一個List一樣行事,並且擁有相同的方法,那麼它就不是那麼糟糕。你只是從中得出,你就完成了。然後,如果您想添加任何附加功能,則可以聲明這些方法並完成。然而,你現在被綁定到列表,如果列表以任何不良方式進行更改,你都會被搞砸。

當你把它變成一個複合類,並且讓List在類內部實例化時,你只需要暴露你想暴露的List的方法。但這意味着你必須重複它們。

3

如果該類的目的是向標準集合添加附加功能,那麼我會繼承集合。如果這個集合只是一張大圖的一部分,那麼這聽起來更像是一個財產。

我會,但是,請考慮使用收集<牛逼>不是List <的牛逼>除非你真的需要在列表<牛逼>的功能。

1

「Cars」類真的需要嗎? 比「列表」增加了一些功能嗎?如果沒有,你應該使用「列表」(或更好的「IList」)。

如果類「汽車」有任何附加的功能,有兩種主要情形:

  • 這個類是「最後的」類,不存在很大的可能性,在別人別人需要擴展它。那麼這個結構是否可以。
  • 該類可能被用作基類。然後我推薦使用這種結構:

public class CarList<T> : List<T> where T : Car { 
    // some added functionality 
} 

如果你想在未來更靈活,你應該使用一個組成:

public class CarList<T> : IList<T> where T : Car { 
    private IList<T> innerList; 
    public CarList() { this.innerList = new List<T>(); } 

    // implementation of IList<T> 

    // some added functionality 
}