Herança da lista

Qual é o caminho mais rápido para implementar uma nova class que herda de List ?

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

Um problema que encontrei: Simplesmente fazendo (1) , descobri que não estou recebendo o benefício de herdar quaisquer construtores de List .

No final, eu gostaria que o Animals se comportasse muito como um List (por exemplo, pode ser construído, compatível com o Linq). Mas, além disso, também gostaria de poder adicionar meus próprios methods personalizados.

Se você quiser criar uma coleção de animais expostos publicamente, você não deve herdar de List e, em vez disso, herdar de Collection e usar a Collection postfix no nome da class. Exemplo: AnimalCollection : Collection .

Isso é apoiado pelas diretrizes de design do framework , mais especificamente:

NÃO use ArrayList , List , Hashtable ou Dictionary em APIs públicas. Use os subtipos Collection , ReadOnlyCollection , KeyedCollection ou CollectionBase. Observe que as collections genéricas são suportadas apenas no Framework versão 2.0 e acima.

Construtores não são herdados junto com a class. Você precisa reimplementar os construtores desejados.

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

Derivando de List não é recomendado. Principalmente porque a List nunca foi feita para extensão, mas para performance.

Se você quiser criar sua própria coleção específica, você deve herdar de Collection . No seu caso, seria:

 class Animals : Collection {} 

Tenha em mente que herdar de List não é tão completo quanto você pode precisar, muitos dos membros não são virtuais, então a única maneira de cobrir a implementação base é sombrear com a new syntax (ao contrário de override ).

Se você precisar começar a expor o comportamento personalizado em ações de lista padrão, eu implementaria todas as interfaces de lista em um tipo que simplesmente usa uma lista interna para o armazenamento real.

Isso depende muito dos seus requisitos finais.

 class Animals : List {} 

parece o melhor caminho, porque você pode usá-lo apenas depois de defini-lo assim.

Então, meu conselho é o título de suas perguntas: Inherit List 😉

Não é necessário herdar da List para usar a syntax de boot da coleção ou usar os methods de extensão do Linq.

Basta implementar IEnumerable e também um método Add .