2008-12-08 15 views
8

Recientemente utilicé una clase que hereda de una colección en lugar de tener la colección instanciada dentro de la clase, ¿es esto aceptable o crea problemas ocultos más adelante en el camino? Ejemplos a continuación en aras de la claridad:Clases con colecciones como propiedades vs. clases Heredar colecciones

public class Cars : List<aCar> 

en lugar de algo como:

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

¿Alguna idea?

Respuesta

10

El problema con esto es que su clase Cars todavía tendrá la interfaz que hereda de List, que puede permitir operaciones que no desea.

6

Eso depende del propósito final de su clase. Si solo va a funcionar como su propia implementación de una colección, use la herencia. Si no, incluya una colección como propiedad. La segunda opción es más versátil:

  • Como sólo puede heredar de una clase, puede que tenga que heredar de otra clase en lugar de recogida
  • Si necesita ver esta clase como una colección puede incluir una propiedad del indexador.
4

He leído la pregunta previamente.

Sugeriría utilizar composición en lugar de herencia. Si desea poder usar todas las cosas funky LINQ, implemente IEnumerable<T> y quizás incluso IList<T> - pero no derivaría directamente del List<T>.

Si haces quieren conseguir las cosas colección "gratis" pero aún así mantener el control, se puede usar CollectionBase. Eso todavía te amarra en términos de tu única oportunidad de heredar, pero al menos tienes más control sobre lo que sucede en la colección.

3

Si quieres que tu clase de Cars actúe como una lista y tener los mismos métodos, no es tan malo. Usted acaba de derivar de eso y listo. Luego, si desea agregar cualquier funcionalidad adicional, puede declarar esos métodos y listo. Sin embargo, ahora estás obligado a List y si List cambia de alguna manera no deseada, estás jodido.

Cuando en su lugar se convierte en una clase compuesta y tiene la lista instanciada dentro de la clase, solo necesita exponer los métodos de la lista que desea exponer. Pero eso significa que tienes que repetirlos todos también.

3

Si el objetivo de la clase es agregar funcionalidad adicional a una colección estándar, heredaría de la colección. Si la colección es solo una parte de una imagen más grande, entonces eso se parece más a una propiedad.

Quisiera, sin embargo, considerar el uso de Colección < T en lugar de > Lista <T> a menos que realmente necesita la funcionalidad en la Lista <T>.

1

¿Es realmente necesaria la clase "Cars"? Tiene alguna funcionalidad agregada que "Lista"? Si no, debe usar "List" (o mejor "IList").

Si la clase "Cars" tiene ninguna funcionalidad añadida, hay dos escenarios principales:

  • esta clase es la clase "final", no hay una gran posibilidad, los otros necesitan que alguien se extendieron. Entonces esta construcción está bien.
  • Esta clase probablemente se utilizará como clase base. Entonces recomiendo utilizar esta construcción:

.

public class CarList<T> : List<T> where T : Car { 
    // some added functionality 
} 

Si quieres ser más flexibles en el futuro, se debe utilizar una composición:

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 
} 
Cuestiones relacionadas