ConstructiCat Logo
CodeBust.
Browse section ▾

Reemplazar Herencia con Delegación.

Problem

Tienes una subclase que usa solo una parte de los métodos de su superclase (o no es posible heredar los datos de la superclase).

Solution

Crea un campo y coloca en él un objeto de la superclase, delega los métodos en el objeto de la superclase y elimina la herencia.

##Example

Antes
Vector isEmpty() Stack
Después
Stack vectorisEmpty() Vector isEmpty() return this.vector.isEmpty(); 1

##Why Refactor

Reemplazar la herencia con composición puede mejorar sustancialmente el diseño de las clases si:

  • Tu subclase viola el principio de sustitución de Liskov, es decir, si la herencia se implementó solo para combinar código común y no porque la subclase sea una extensión de la superclase.

  • La subclase usa solo una parte de los métodos de la superclase. En este caso, es solo cuestión de tiempo antes de que alguien llame a un método de la superclase que no debería haber llamado.

En esencia, esta técnica de refactorización divide ambas clases y convierte la superclase en la auxiliar de la subclase, no en su padre. En lugar de heredar todos los métodos de la superclase, la subclase tendrá solo los métodos necesarios para delegar en los métodos del objeto de la superclase.

##Benefits

  • Una clase no contiene métodos innecesarios heredados de la superclase.

  • En el campo de delegación pueden colocarse diversos objetos con diversas implementaciones. En efecto, obtienes el patrón de diseño Strategy.

##How to Refactor

  1. Crea un campo en la subclase para almacenar la superclase. Durante la etapa inicial, coloca en él el objeto actual.

  2. Cambia los métodos de la subclase para que usen el objeto de la superclase en lugar de this.

  3. Para los métodos heredados de la superclase que se llaman en el código cliente, crea métodos de delegación simples en la subclase.

  4. Elimina la declaración de herencia de la subclase.

  5. Cambia el código de inicialización del campo en el que se almacena la antigua superclase creando un nuevo objeto.