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.