Favoreciendo la composición sobre la herencia en Java con ejemplos

Favorecer la composición sobre la herencia es un principio en la programación orientada a objetos (POO). Las clases deben lograr un comportamiento polimórfico y la reutilización del código mediante su composición en lugar de la herencia de una clase base o principal. Para obtener la mayor flexibilidad de diseño, el principio de diseño dice que se debe favorecer la composición sobre la herencia. 

La herencia solo debe usarse cuando la subclase ‘es una’ superclase. No use la herencia para obtener la reutilización del código. Si no hay una relación ‘es un’, use la composición para reutilizar el código.

Razones para favorecer la composición sobre la herencia en Java y OOP:

  1. El hecho de que Java no admita herencias múltiples es una razón para preferir la composición a la herencia en Java. Dado que solo puede extender una clase en Java, pero si necesita varias funciones, como leer y escribir datos de caracteres en un archivo, necesita la funcionalidad de Lector y Escritor. Hace que su trabajo sea simple tenerlos como miembros privados, y esto se llama Composición.
  2. La composición ofrece una mejor capacidad de prueba de una clase que la herencia. Si una clase consta de otra clase, puede construir fácilmente un objeto simulado que represente una clase compuesta por el bien de la prueba. Este privilegio no se da por herencia.
  3. Aunque tanto la Composición como la Herencia le permiten reutilizar el código, una de las desventajas de la Herencia es que rompe la encapsulación. Si la subclase depende de la acción de la superclase para su función, de repente se vuelve frágil. Cuando cambia el comportamiento de la superclase, la funcionalidad de la subclase se puede romper sin ninguna modificación de su parte.
  4. En los patrones de diseño clásicos atemporales, varios patrones de diseño orientados a objetos enumerados por Gang of Four: Elements of Reusable Object-Oriented Software favorecen la composición sobre la herencia. El patrón de diseño de estrategia, donde la composición y la delegación se utilizan para modificar el comportamiento de Context sin tocar el código de contexto, es un ejemplo clásico de esto. En lugar de obtenerlo por herencia, debido a que Context usa la composición para transmitir la estrategia, es simple tener una nueva implementación de la estrategia en tiempo de ejecución.
  5. Otra razón por la que se prefiere la composición a la herencia es la flexibilidad. Si usa Composición, es lo suficientemente flexible como para reemplazar la versión mejor y actualizada de la implementación de la clase Compuesta. Un ejemplo es el uso de la clase de comparación, que proporciona características para la comparación.

Herencia :

La herencia es la estrategia de diseño para implementar una relación entre objetos en la programación orientada a objetos. La palabra clave extends se usa para implementar la herencia en Java.

class Person {
 String title;
 String name;
 int age;
}

class Employee extends Person {
 int salary;
 String title;
}

En el ejemplo anterior, El Empleado «es una» Persona o hereda de Persona. Todas las relaciones de herencia son relaciones «es-un». El Empleado también oculta la propiedad del título de Persona, es decir, Empleado. title devolverá el título del Empleado, no la Persona.

Composición :

En la programación orientada a objetos, la composición es la estrategia de la arquitectura para ejecutar una relación entre objetos. La composición de Java se realiza utilizando variables de instancia de otros objetos. 

class Person {
 String title;
 String name;
 int age;

 public Person(String title, String name, String age) {
    this.title = title;
    this.name = name;
    this.age = age;
 }

}

class Employee {
 int salary;
 private Person person;

 public Employee(Person p, int salary) {
     this.person = p;
     this.salary = salary;
 }
}

Person p = new Person ("Mr.", "Kapil", 25);
Employee kapil = new Employee (p, 100000);

La composición suele ser una relación «tiene un» o «usa un». Aquí la clase Empleado tiene una Persona. No hereda de Persona, sino que se le pasa el objeto Persona, por lo que «tiene una» Persona.

Composición sobre herencia

Ahora supongamos que desea crear un tipo de administrador, por lo que termina con la siguiente sintaxis, que no está permitida en Java (la herencia múltiple no está permitida en Java):

//herencia multiple no permitida

class Manager extends Person, Employee {
}

ahora tenemos que favorecer la composición sobre la herencia usando la siguiente sintaxis:

Class Manager {
 public string title;
 public Manager(Person p, Employee e)
 {
    this.title = e.title;
 }
}

Publicación traducida automáticamente

Artículo escrito por sachinchhipa44 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 *