最近我使用了一个继承自集合的类,而不是在类中实例化集合,这是可以接受的,还是会在未来的路上产生看不见的问题?以下示例为了清楚起见:
public class Cars : List<aCar>
而不是像:
public class Cars
{
List<aCar> CarList = new List<aCar>();
}
有什么想法吗?
答案 0 :(得分:10)
这个问题是你的Cars类仍然会有它从List继承的接口,这可能允许你不想要的操作。
答案 1 :(得分:6)
这取决于你班级的最终目的。如果它只是作为你自己的集合实现工作使用继承。如果没有,请将集合作为属性包含在内。第二种选择更通用:
答案 2 :(得分:4)
我之前误解了这个问题。
我建议使用合成而不是继承。如果您希望能够使用所有时髦的LINQ内容,请务必实现IEnumerable<T>
甚至IList<T>
- 但我不会直接从List<T>
派生。
如果你做希望“免费”获取收藏内容但仍保留控制权,则可以使用CollectionBase。在你继承的一次性方面,这仍然会让你失望,但至少你可以更好地控制集合中发生的事情。
答案 3 :(得分:3)
如果你希望你的Cars类像List一样行动,并且使用相同的方法而不是那么糟糕。你只是从中衍生而已。然后,如果您想添加任何其他功能,您只需声明这些方法即可。但是,你现在已经绑定了List,如果List以任何不合需要的方式发生变化,那你就搞砸了。
当你把它变成一个复合类并且在类中实例化了List时,你只需要公开你想要暴露的List方法。但这意味着你必须重复它们。
答案 4 :(得分:3)
如果该类的目的是为标准集合添加其他功能,那么我将继承该集合。如果集合只是一张大图片的一部分,那么这听起来更像是一个属性。
但是,我会考虑使用Collection&lt; T&gt;代替List&lt; T&gt;除非你真的需要List&lt; T&gt;。中的功能答案 5 :(得分:1)
“汽车”课程真的需要吗? 有一些比“列表”更多的功能?如果没有,你应该使用“List”(或更好的“IList”)。
如果“Cars”类具有任何附加功能,则有两种主要方案:
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
}