最近,我使用了一個繼承自集合的類,而不是在集合中實例化集合,這是否可以接受,還是會在未來的路上創建看不見的問題?下面清楚起見例子:將集合作爲屬性與類的類與類繼承集合
public class Cars : List<aCar>
,而不是像這樣:
public class Cars
{
List<aCar> CarList = new List<aCar>();
}
有什麼想法?
最近,我使用了一個繼承自集合的類,而不是在集合中實例化集合,這是否可以接受,還是會在未來的路上創建看不見的問題?下面清楚起見例子:將集合作爲屬性與類的類與類繼承集合
public class Cars : List<aCar>
,而不是像這樣:
public class Cars
{
List<aCar> CarList = new List<aCar>();
}
有什麼想法?
問題在於你的Cars類仍然有它從List繼承的接口,它可能允許你不想要的操作。
這取決於你班級的最終目的。如果它只是作爲你自己的集合實現來使用繼承。如果沒有,請將集合包含爲屬性。第二種選擇是更通用:
我誤解了以前的問題。
我會建議使用組合而不是繼承。如果你想能夠使用所有時髦的LINQ的東西,通過一切手段實現IEnumerable<T>
甚至IList<T>
- 但我不會直接從List<T>
派生。
如果你做想要獲得收集東西「免費」,但仍然保留控制權,你可以使用CollectionBase。在繼承方面,這仍然會使你失望,但至少你可以更好地控制集合中發生的事情。
如果你想讓你的Cars類像一個List一樣行事,並且擁有相同的方法,那麼它就不是那麼糟糕。你只是從中得出,你就完成了。然後,如果您想添加任何附加功能,則可以聲明這些方法並完成。然而,你現在被綁定到列表,如果列表以任何不良方式進行更改,你都會被搞砸。
當你把它變成一個複合類,並且讓List在類內部實例化時,你只需要暴露你想暴露的List的方法。但這意味着你必須重複它們。
如果該類的目的是向標準集合添加附加功能,那麼我會繼承集合。如果這個集合只是一張大圖的一部分,那麼這聽起來更像是一個財產。
我會,但是,請考慮使用收集<牛逼>不是List <的牛逼>除非你真的需要在列表<牛逼>的功能。
「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
}