Los límites de la herencia profunda
Parte de la sección Programación Orientada a Objetos del Journey de JavaScript de Coddy — lección 48 de 56.
Si bien la herencia es útil, crear jerarquías de herencia muy profundas (padre → hijo → nieto → bisnieto) puede generar problemas. Cuanto más profunda sea la cadena, más difícil resultará comprender, mantener y modificar el código.
Veamos qué sucede con una cadena de herencia profunda:
// Base class
class Vehicle {
constructor(type) {
this.type = type;
this.isRunning = false;
}
start() {
this.isRunning = true;
console.log(`${this.type} started`);
}
}
// First level of inheritance
class Car extends Vehicle {
constructor(make, model) {
super("Car");
this.make = make;
this.model = model;
this.wheels = 4;
}
honk() {
console.log("Beep beep!");
}
}
// Second level of inheritance
class SportsCar extends Car {
constructor(make, model, topSpeed) {
super(make, model);
this.topSpeed = topSpeed;
}
race() {
this.start();
console.log(`Racing at ${this.topSpeed} mph!`);
}
}En este ejemplo, SportsCar tiene dos niveles de profundidad en la herencia. Esto puede dar lugar a varios problemas:
- Los cambios en Vehicle podrían romper inesperadamente SportsCar
- A medida que la cadena de herencia crece, se vuelve más difícil rastrear de dónde provienen los métodos y las propiedades
- Te ves obligado a entablar relaciones "es-un" que podrían no ser lo suficientemente flexibles
Desafío
Completa el archivo Robot.js para que el robot sea funcional. En este momento, el robot está construido pero no puede hacer nada.
Qué hacer en <strong>Robot.js</strong>:
- Crea los componentes speaker y mover dentro del constructor de Robot
- Usa los componentes en los métodos:
- En
greet(): Llama athis.speaker.speak("Hello!"); - En
walkForward(): Llama athis.mover.move("forward");
- En
Por qué hacemos esto: Esto es composición - el robot se construye combinando componentes más pequeños. El robot tiene-un (has-a) speaker (para hablar) y tiene-un (has-a) mover (para moverse), en lugar de heredar estas habilidades.
Pruébalo tú mismo
import { Robot } from './Robot.js';
const myRobot = new Robot('Robo');
myRobot.greet(); // Debería mostrar: Saying: "Hello!"
myRobot.walkForward(); // Debería mostrar: Moving forwardEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Objetos y la palabra clave this
Repaso rápido: ObjetosAgregar métodos a los objetosEntendiendo la palabra clave thisFunciones constructorasLa palabra clave newDesafío de repaso7Herencia y la palabra clave extends
HerenciaLa relación "es-un"La palabra clave extendsEl método super()Heredar propiedades y métodosDesafío de repaso13Composición vs. Herencia
La relación "tiene-un" vs. "es-un"Los límites de la herencia profundaConstrucción de objetos2Organización del código
¿Qué son los módulos?Exportar con exportImportar con importExportaciones por defecto vs. nombradas5Encapsulamiento y Acceso
EncapsulamientoCampos de clase públicos y privadosMétodos privadosDesafío de repaso8Organización del código OOP
Organizar clases en módulos11Proyecto: Un renderizador de figuras
Configuración: Clase Figura y exportaciónHerencia de la clase CírculoSobrescritura y método de áreaContador de figuras estático14Sistema de Gestión de Biblioteca
Diseño de la BibliotecaClase Libro con ComposiciónValidación del Autor del Libro9Métodos y propiedades estáticos
Nivel de clase vs. Nivel de instanciaPropiedades estáticasMétodos de utilidad estáticosDesafío de repaso