2009-05-07 18 views
37

¿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?

+5

Buena discusión aquí: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+1

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

Respuesta

46

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.

+2

Good rule de pulgar. –

24

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.

+3

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

+0

@Chadworthington: No es cierto; una subclase puede anular métodos y reemplazarlos, esencialmente una restricción, sin delegar de nuevo a la superclase. –

+1

@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. –

4

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.

3

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.
1

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.

Cuestiones relacionadas