2010-04-06 3 views
5

¿Cuáles son las ventajas/desventajas de la Opción 2 sobre 1 en este ejemplo?¿Cuáles son las ventajas de utilizar la composición sobre la herencia en la que necesitamos agregar comportamiento a una lista <>?

Opción 1 (herencia):

public class SalesList : List<Sales> 
{ 
    //methods that add extra behavior List<Sales> 
} 

Opción 2 (Composición):

public class SalesList 
{ 
    private List<Sales> _list; 
    //methods that add extra behavior to List<Sales> 
} 
+0

posible duplicado de http://stackoverflow.com/questions/1598722/should-i-use-inheritance-or-composition – Lucero

Respuesta

1

Opción 1
- Ventajas - todas las ventajas de la herencia & reutilización
- Desventajas - El código es ahora señalando a los consumidores que se dervied de la lista. Si esto necesita cambiar en una fecha posterior, todos los consumidores relacionados se verán afectados.

Opción 2
- Ventajas: los detalles de implementación sobre el almacenamiento de los datos de ventas se abstraen del consumidor. Entonces, si la implementación necesita cambiar (digamos un diccionario, por ejemplo), el consumidor de la clase será inmune a estos cambios.
- Desventajas: la clase SalesList ahora tendrá que exponer métodos adicionales para obtener y/o establecer el objeto _list interno. este es un código adicional que debe mantenerse. Además, si la implementación interna cambia, debe tener cuidado de seguir respaldando el comportamiento anterior ...

Solo se me ocurren algunas ideas.

HTH.

2

La ventaja de la opción 2 es la agilidad. Con la composición, puede elegir qué partes de la interfaz de la lista expone.

Imagine que luego decide no extenderse desde otra clase. Por ahora, algunos de los usuarios de su biblioteca habrán utilizado los métodos proporcionados por List, por lo que deberá implementar todos los métodos de la lista usted mismo: add/addAll/contains/retainAll. Es una gran cantidad de métodos para implementar para una lista de ventas simple.

Básicamente, esto se reduce a "en caso de duda, déjalo fuera", que Joshua Bloch habla en Bumper-Sticker API Design. Cada faceta de una API debe ser lo más pequeña posible, pero no más pequeña. Siempre puede agregar cosas más tarde, pero no puede llevárselas.

2

La principal desventaja de Composition es que debe envolver (duplicar) todos los métodos públicos de la Lista privada si necesita presentar la misma interfaz, en Herencia ya tiene todos ellos disponibles, pero no puede anula cualquiera de los que se hicieron no anulables (en C# significa que el método debe marcarse como "virtual", en Java no se puede marcar como "final").

En C# 3 en adelante, puede usar los Métodos de extensión, que dan la apariencia de herencia sin ensuciar verdaderamente el árbol de jerarquía.

+0

Una desventaja más grande es que uno no podrá pasar un 'SalesList' a cualquier método que se escriba para esperar una 'Lista ' o una 'Lista ' genérica. Reescribir todos los métodos de 'List' puede ser molesto, pero difícilmente imposible. Si un método para el que no se tiene el código espera una 'Lista ', usar ese método puede ser difícil o imposible. Parece que frenar una referencia a la lista interna soluciona ese problema, pero crea muchos más propios. Debido a que muchos métodos de 'List' no son virtuales, una clase derivada no puede cambiar mucho su comportamiento; uno puede estancarse sin importar lo que haga. – supercat

0

En composición, puede cambiar la implementación de la superclase dinámicamente en tiempo de ejecución. Pero al usar la herencia no puede cambiar la implementación de la superclase en tiempo de ejecución.

En composición, depende del tipo de objeto que está pasando al colocador y se comportará de acuerdo con eso.Se le dará una mayor flexibilidad en la aplicación

2

herencia nos permite formar una jerarquía de clases, de tal manera que el padre es un * súper * configurar y todos de su hijo son * sub * conjunto, lo que permite la generalización, especialización y para aplicar substitution principle

Cuestiones relacionadas