Sobes.tech
Junior

¿En qué consisten las diferencias entre herencia y composición en la programación orientada a objetos?

sobes.tech AI

Respuesta de la IA

Herencia:

  • Relación "es un" (is-a).
  • La clase hija hereda los campos y métodos de la clase padre.
  • Se usa para crear versiones especializadas de clases existentes.
  • Puede llevar a jerarquías rígidas y problemas con la herencia múltiple.

Composición:

  • Relación "tiene" (has-a).
  • La clase contiene instancias de otras clases como sus campos.
  • Delegar la ejecución de tareas a los objetos contenidos.
  • Proporciona flexibilidad y la posibilidad de reemplazar componentes.

Ejemplo en Java:

// Herencia
class Vehicle { // Clase base
    void start() { /* ... */ }
}

class Car extends Vehicle { // Hereda de Vehicle
    // Métodos específicos de Car
}

// Composición
class Engine { // Componente constituyente
    void start() { /* ... */ }
}

class AnotherCar { // Clase que usa composición
    private Engine engine; // Contiene una instancia de Engine

    AnotherCar(Engine engine) {
        this.engine = engine;
    }

    void start() {
        engine.start(); // Delegación
    }
}

Las diferencias se pueden presentar en forma de tabla:

Criterio Herencia Composición
Relación "es un" (is-a) "tiene" (has-a)
Rigidez Más rígido Más flexible
Reutilización A través de jerarquías de clases A través de instancias de objetos
Cambio de comportamiento Sobrescribir métodos Reemplazar objetos contenidos
Aplicación Especialización, extensión de funcionalidad Agregación, construcción a partir de partes

La composición es generalmente preferible a la herencia en la mayoría de los casos para lograr mayor flexibilidad y menor dependencia entre clases.