¿Podría alguien explicar por favor cuándo quisiera usar la delegación en lugar de la herencia?Cuándo usar la delegación en lugar de la herencia?
Respuesta
Cuando desee "copiar"/Exponer la API de la clase base, use la herencia. Cuando solo desee "copiar" la funcionalidad, use la delegación.
Un ejemplo de esto: Desea crear una pila fuera de una lista. Stack solo tiene pop, push y peek. No debe usar la herencia, dado que no quiere push_back, push_front, removeAt, et al.-tipo de funcionalidad en una pila.
Good rule de pulgar. –
No tienen nada que ver entre sí. Delegación es un comportamiento. La herencia es una técnica modelo.
La herencia es para modelar "is-a". Una computadora "es un" sistema electrónico.
Delegación es la forma en que los métodos proporcionan resultados. Algunas veces, un objeto delegará trabajo a otro objeto. La delegación puede ser a través de cualquier relación: puede delegar a una superclase, a un miembro de un compuesto o agregado, o cualquier relación.
La herencia es para modelar relaciones "is-a" pero también cuando la subclase extiende la funcionalidad de la clase base y no hace nada para restringirla. – ChadD
@Chadworthington: No es cierto; una subclase puede anular métodos y reemplazarlos, esencialmente una restricción, sin delegar de nuevo a la superclase. –
@S.Lott: Si bien puede anular los métodos, debe tener cuidado de anular todos los métodos que exponen el comportamiento que desea restringir, incluidos algunos que aún no se han escrito. El consejo de @ Chadworthington es más seguro, particularmente cuando no controlas la superclase. –
Puede usar la delegación en varias instancias de clases internas para simplificar su funcionalidad en una agrupación común. Si su idioma no implementa herencia múltiple, por ejemplo, puede heredar de una de las bases y ajustar la otra, delegando la funcionalidad que desea exponer a la implementación subyacente. La herencia también vincula a su clase con la jerarquía de clases que está heredando, mientras que con la delegación puede mantener su lugar en su propia jerarquía y delegar llamadas a otra.
asuma que su clase se llama B y el/delegado de clase derivada que se denomina una continuación
Estos son algunos ejemplos en los que se están utilizando herencia o delegación:
If
- desea expresar relación (is-a) luego desea utilizar la herencia.
- quieres pasar tu clase a una API existente esperando A's entonces necesitas usar la herencia.
- desea mejorar A, pero A es final y no puede ser subclasificado, entonces necesita usar composición y delegación.
En mi opinión, se puede llamar a la delegación cuando es el momento de usar y la herencia está incrustada.
Tome the in_threads gem por ejemplo, usa el delegador InThreads para implementar los hilos para cualquier módulo Ruby Enumerable. Con esto, solo llama a los métodos in_threads en una matriz, se ejecutará en hilos.
- 1. ¿Qué es la delegación? ¿Cuándo querría usarlo?
- 2. Cuándo usar `static_assert` en lugar de SFINAE?
- 3. ¿Cuándo usar 'función' en lugar de 'diversión'?
- 4. Cuándo usar ImageButton en lugar de ImageView?
- 5. Cuándo usar HttpApplicationState en lugar de Web.Caching.Cache?
- 6. Cuándo usar atributos en lugar de propiedades?
- 7. ¿Cuándo debería usar una estructura en lugar de una clase?
- 8. Herencia privada VS composición: cuándo usar qué?
- 9. ¿Cuándo es apropiado usar genéricos versus herencia?
- 10. Patrón de diseño para usar en lugar de herencia múltiple
- 11. cuándo usar la función htmlspecialchars()?
- 12. Herencia en lugar de typedef
- 13. Inicialización uniforme en C++ 0x, cuándo usar() en lugar de {}?
- 14. ¿Cuándo debo usar print en lugar de echo en PHP?
- 15. ¿Cuándo podría la herencia múltiple ser la única solución razonable?
- 16. Cuándo usar Struct en lugar de Hash en Ruby?
- 17. ¿Cuándo debo usar un UserControl en lugar de una página?
- 18. ¿Cuándo es correcto usar ViewData en lugar de ViewModels?
- 19. ¿Cuándo debería usar __forceinline en lugar de inline?
- 20. ¿Cuándo se debe usar Throwable en lugar de Excepción nueva?
- 21. ¿Cuándo debería usar NSURL en lugar de NSString y viceversa?
- 22. ¿Cuándo debería usar un campo en lugar de una propiedad?
- 23. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 24. ¿Cuándo debería usar string en lugar de stringstream?
- 25. ¿Cuándo es mejor usar zip en lugar de izip?
- 26. Mercurial: cuándo usar la actualización
- 27. Cuándo usar la clase Partitioner?
- 28. Incrustación en lugar de herencia en Ir
- 29. ¿Cuándo debería usar el doble en lugar del decimal?
- 30. Log4net: estrategia óptima al usar la herencia
Buena discusión aquí: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –
No voy a ampliar las respuestas dadas, sin embargo, un libro que encontré realmente útil con este tipo de Problemas de diseño de OO es el excelente libro de Arthur Riel ** Heurística de diseño orientado a objetos **. http://www.davegardner.me.uk/reading/oo-design-heuristics/ http://www.amazon.co.uk/Object-oriented-Design-Heuristics-Arthur-Riel/dp/020163385X – Dave