Delegation - Tensho97/Aprende-a-Aprender GitHub Wiki

Patrón delegation


Utilidades y ventajas

Utilidad: Cuando se quiere extender y reutilizar la funcionalidad de una clase SIN USAR LA HERENCIA.

Ventajas:

  • En vez de herencia múltiple.
  • Cuando una clase que hereda de otra quiere ocultar algunos de los métodos heredados.
  • Compartir código que NO se puede heredar.

Problema

Tenemos las siguientes clases:

ClaseA{
  a1();
}
-----------
Clase B{
  b1();
  b2();
}

Y queremos una claseC que herede de ambas, y disponer de lo siguiente:

ClaseC{
  a1();
  b1();
  b2();
}

Solución

Como no se admite la herencia múltiple, solo podemos usarla con una de las clases. Siguiendo con el ejemplo anterior:

Tendremos ahora la siguiente clase C:

ClaseC extends ClaseA{
  a1();   // metodo de la ClaseA
}

Para implementar los métodos de ClaseB no usaremos la herencia sino la relación "usa". Para implementar esta relación crearemos un objeto de ClaseB en el constructor de la ClaseC. Una vez hecho esto creamos los métodos de ClaseB.

 ClassC extends ClaseA{
  
  ClaseB objB;
  
  //Constructor
  ClassC(){
    objB = new B();  //Objeto de Clase B
  }

  a1()  //metodo heredado de ClaseA
  
  void b1(){  //de este modo tenemos el metodo b1
    objB.b1();
  }

//metodo b2() se implementa del mismo modo

De este modo conseguimos la herencia sin usar extends, y en caso de no querer usar algún método de la clase heredada, no se implementa.



Autor : Miguel