具有集合作为属性与类继承集合的类

时间:2008-12-08 15:44:50

标签: c# class inheritance

最近我使用了一个继承自集合的类,而不是在类中实例化集合,这是可以接受的,还是会在未来的路上产生看不见的问题?以下示例为了清楚起见:

public class Cars : List<aCar>

而不是像:

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

有什么想法吗?

6 个答案:

答案 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
}