c# - generic - Heredar de List<T>
list pop c# (6)
¿Cuál es la forma más rápida de implementar una nueva clase que hereda de List<T>
?
class Animal {}
class Animals : List<Animal> {} // (1)
Un problema que he encontrado: simplemente haciendo (1) , he descubierto que no obtengo el beneficio de heredar ningún constructor de List<T>
.
Al final, me gustaría que Animals
comporte mucho como List<T>
(por ejemplo, se puede construir, compatibilidad con Linq). Pero además, también me gustaría poder agregar mis propios métodos personalizados.
Los constructores no son heredados junto con la clase. Tienes que volver a implementar tus constructores deseados.
public class AnimalsCollection : List<Animal>
{
public AnimalsCollection(IEnumerable<Animal> animals) : base(animals) {}
}
No es necesario heredar de List
para usar la sintaxis de inicialización de colección o usar métodos de extensión Linq.
Simplemente implemente IEnumerable
y también un método Add
.
No se recomienda derivar de List<T>
. Principalmente porque List nunca fue pensado para la extensión, sino para el rendimiento.
Si desea crear su propia colección específica, debe heredar de Collection<T>
. En tu caso sería:
class Animals : Collection<Animal> {}
Si desea crear una colección de animales públicamente expuesta , no debe heredar de List<T>
y en su lugar heredar de Collection<T>
y utilizar la Collection
postfix en el nombre de la clase. Ejemplo: AnimalCollection : Collection<Animal>
.
Esto es respaldado por las pautas de diseño del marco , más específicamente:
NO use
ArrayList
,List<T>
,Hashtable
oDictionary<K,V>
en API públicas. En su lugar, utilice losKeyedCollection<K,T>
Collection<T>
,ReadOnlyCollection<T>
,KeyedCollection<K,T>
o CollectionBase. Tenga en cuenta que las colecciones genéricas solo se admiten en la versión 2.0 y posteriores del Framework.
Tenga en cuenta que heredar de List no está tan completo como puede necesitar, muchos de los miembros no son virtuales, por lo que la única forma de cubrir la implementación base es sombrearlo con la new
sintaxis (en lugar de override
).
Si necesita comenzar a exponer el comportamiento personalizado en acciones de lista estándar, implementaría todas las interfaces de lista en un tipo que simplemente utiliza una lista interna para el almacenamiento real.
Esto depende en gran medida de sus requisitos finales.
class Animals : List<Animal> {}
Parece la mejor manera, porque puede usarlo justo después de definirlo así.
Así que mi consejo es el título de su pregunta: Inherit List<T>
;-)