继承自List <t> </t>

时间:2011-03-21 10:14:45

标签: c# list inheritance collections

实现从List<T>继承的新类的最快方法是什么?

class Animal {}

class Animals : List<Animal> {} // (1)

我遇到的一个问题:通过简单地执行(1),我发现我没有从List<T>继承任何构造函数的好处。

最后,我希望Animals的行为与List<T>非常相似(例如,可以构建,与Linq兼容)。但此外,我还希望能够添加自己的自定义方法。

6 个答案:

答案 0 :(得分:48)

如果您要创建公开曝光的动物集合,则不应继承List<T>,而应继承Collection<T>并使用后缀Collection班级名称。示例:AnimalCollection : Collection<Animal>

framework design guidelines支持此功能,更具体地说:

  

请勿使用ArrayListList<T>,   HashtableDictionary<K,V>   公共API。使用Collection<T>,   ReadOnlyCollection<T>,   KeyedCollection<K,T>,或   而不是CollectionBase子类型。注意   通用集合只是   Framework 2.0版支持   以及。

答案 1 :(得分:24)

构造函数不会与类一起继承。你必须重新实现你想要的构造函数。

public class AnimalsCollection : List<Animal>
{
     public AnimalsCollection(IEnumerable<Animal> animals) : base(animals) {} 
}

答案 2 :(得分:12)

不建议从List<T>派生。主要是因为List从未用于扩展,而是用于性能。

如果要创建自己的特定集合,则应从Collection<T>继承。在你的情况下,它将是:

class Animals : Collection<Animal> {}

答案 3 :(得分:6)

请记住,从List继承并不像您可能需要的那样功能齐全,很多成员都不是虚拟的,因此覆盖基本实现的唯一方法是使用new语法对其进行遮蔽(而不是override)。

如果您需要开始在标准列表操作上公开自定义行为,我会在一个只使用内部列表进行实际存储的类型上实现所有列表接口。

这在很大程度上取决于您的最终要求。

答案 4 :(得分:4)

class Animals : List<Animal> {}

这是最好的方式,因为你可以在定义它之后立即使用它。

所以我的建议是你的问题标题: Inherit List<T> ; - )

答案 5 :(得分:4)

List继承以使用集合初始化语法或使用Linq扩展方法是不必要的。

只需实施IEnumerableAdd方法。