refactor how code design oop inheritance delegation

design - how to refactor code



¿Cuándo usar delegación en lugar de herencia? (5)

¿Podría alguien explicar por favor cuándo querría usar la delegación en lugar de la herencia?


Cuando quiere "copiar" / Exponer la API de la clase base, usa la herencia. Cuando solo desee "copiar" la funcionalidad, use la delegación.

Un ejemplo de esto: quieres crear una pila 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.


En mi opinión, se puede llamar a la delegación cuando es el momento de usar y la herencia está incorporada.

Tomemos la gema in_threads, por ejemplo, usa el delegador InThreads para implementar los subprocesos para cualquier módulo Ruby Enumerable. Con esto, solo llama a los métodos in_threads en una matriz, se ejecutará en hilos.


No tienen nada que ver el uno con el otro. 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 cómo 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.


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.


Supongamos que su clase se llama B y la derivada / delegada a la clase se llama A entonces

Aquí hay algunos ejemplos cuando se usa la herencia o la delegación:
Si

  • desea expresar una relación (is-a) y luego desea usar la herencia.
  • desea poder pasar su clase a una API existente esperando A, entonces necesita usar herencia.
  • desea mejorar A, pero A es final y no puede ser subclasificado, entonces necesita usar composición y delegación.