Reemplazar Herencia con Delegación.
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).
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
##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
-
Crea un campo en la subclase para almacenar la superclase. Durante la etapa inicial, coloca en él el objeto actual.
-
Cambia los métodos de la subclase para que usen el objeto de la superclase en lugar de
this. -
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.
-
Elimina la declaración de herencia de la subclase.
-
Cambia el código de inicialización del campo en el que se almacena la antigua superclase creando un nuevo objeto.