Delegación vs Herencia en Java

La herencia en la programación Java es el proceso por el cual una clase toma la propiedad de otra clase. es decir, las nuevas clases, conocidas como clases derivadas o secundarias, asumen los atributos y el comportamiento de las clases preexistentes, que se denominan clases base o superclase o clase principal.
Delegar es simplemente pasar un deber a alguien/algo más. 
 

  • La delegación puede ser una alternativa a la herencia.
  • Delegación significa que utiliza un objeto de otra clase como una variable de instancia y reenvía mensajes a la instancia.
  • Es mejor que la herencia para muchos casos porque te hace pensar en cada mensaje que reenvías, porque la instancia es de una clase conocida, en lugar de una clase nueva, y porque no te obliga a aceptar todos los métodos del super clase: puede proporcionar solo los métodos que realmente tienen sentido.
  • La delegación se puede ver como una relación entre objetos en la que un objeto reenvía ciertas llamadas de método a otro objeto, llamado su delegado.
  • La principal ventaja de la delegación es la flexibilidad del tiempo de ejecución: el delegado se puede cambiar fácilmente en el tiempo de ejecución. Pero a diferencia de la herencia, la delegación no es compatible directamente con los lenguajes orientados a objetos más populares y no facilita el polimorfismo dinámico .

Java

// Java program to illustrate
// delegation
class RealPrinter {
    // the "delegate"
    void print()
    {
        System.out.println("The Delegate");
    }
}
 
class Printer {
    // the "delegator"
    RealPrinter p = new RealPrinter();
 
    // create the delegate
    void print()
    {
        p.print(); // delegation
    }
}
 
public class Tester {
 
    // To the outside world it looks like Printer actually prints.
public static void main(String[] args)
    {
        Printer printer = new Printer();
        printer.print();
    }
}

Producción: 
 

The Delegate

Cuando delega, simplemente está llamando a alguna clase que sabe lo que debe hacerse. Realmente no te importa cómo lo hace, lo único que te importa es que la clase a la que llamas sepa lo que hay que hacer.
 

Mismo código usando Herencia

Java

// Java program to illustrate
// Inheritance
class RealPrinter {
    // base class implements method
    void print()
    {
        System.out.println("Printing Data");
    }
} 3 // Printer Inheriting functionality of real printer
    class Printer extends RealPrinter {
 
    void print()
    {
        super.print(); // inside calling method of parent
    }
}
 
public class Tester {
 
    // To the outside world it looks like Printer actually prints.
public static void main(String[] args)
    {
        Printer printer = new Printer();
        printer.print();
    }
}

Producción: 
 

Printing Data

¿Cuándo usar qué?  
Estos son algunos ejemplos cuando se utilizan la herencia o la delegación: 
suponga que su clase se llama B y la clase derivada/delegada se llama A, entonces si 
 

  • Quiere expresar la relación (es-a) y luego quiere usar Herencia.
  • Desea poder pasar su clase a una API existente que espera A, entonces necesita usar la herencia.
  • Desea mejorar A, pero A es final y ya no se puede subclasificar, entonces necesita usar composición y delegación.
  • Desea la funcionalidad de un método y no desea anular el método, entonces debe optar por la delegación.

Este artículo es una contribución de Abhishek Gupta . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *