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.
##Ejemplo
class Stack extends Vector {
void push(Object element) {
insertElementAt(element, 0);
}
Object pop() {
Object result = firstElement();
removeElementAt(0);
return result;
}
}class Stack {
private Vector elements = new Vector();
void push(Object element) {
elements.insertElementAt(element, 0);
}
Object pop() {
Object result = elements.firstElement();
elements.removeElementAt(0);
return result;
}
boolean isEmpty() {
return elements.isEmpty();
}
}##Por qué refactorizar
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.
##Ventajas
-
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.
##Cómo refactorizar
-
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.