关于C:从列表继承

Inheriting from List<T>

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

1
2
3
class Animal {}

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

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

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


如果要创建公开的动物集合,则不应继承List,而应继承Collection,并在类名中使用后缀Collection。示例:AnimalCollection : Collection

这一点得到了框架设计指南的支持,更具体地说:

DO NOT use ArrayList, List,
Hashtable, or Dictionary in
public APIs. Use Collection,
ReadOnlyCollection,
KeyedCollection, or
CollectionBase subtypes instead. Note
that the generic collections are only
supported in the Framework version 2.0
and above.


构造函数不与类一起继承。必须重新实现所需的构造函数。

1
2
3
4
public class AnimalsCollection : List<Animal>
{
     public AnimalsCollection(IEnumerable<Animal> animals) : base(animals) {}
}


不建议从List衍生。主要是因为这个列表不是为了扩展,而是为了性能。

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

1
class Animals : Collection<Animal> {}


请记住,从列表继承并不像您可能需要的那样功能齐全,许多成员不是虚拟的,因此覆盖基本实现的唯一方法是使用new语法(而不是override)来隐藏它。

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

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


使用集合初始化语法或使用LINQ扩展方法不需要从List继承。

只需实现IEnumerableAdd方法。


1
class Animals : List<Animal> {}

寻找最好的方法,因为你可以在这样定义它之后使用它。

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