Menu
CoddyTech

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.

Aunque la herencia es útil, crear jerarquías de herencia muy profundas (padre → hijo → nieto → bisnieto) puede causar problemas. Cuanto más profunda sea la cadena, más difícil será entender, mantener y modificar el código.

Veamos qué sucede con una cadena de herencia profunda:

// Clase base
class Vehicle {
  constructor(type) {
    this.type = type;
    this.isRunning = false;
  }
  
  start() {
    this.isRunning = true;
    console.log(`${this.type} started`);
  }
}

// Primer nivel de herencia
class Car extends Vehicle {
  constructor(make, model) {
    super("Car");
    this.make = make;
    this.model = model;
    this.wheels = 4;
  }
  
  honk() {
    console.log("Beep beep!");
  }
}

// Segundo nivel de herencia
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 está dos niveles dentro de la jerarquía de herencia. Esto puede llevar a varios problemas:

  1. Los cambios en Vehicle podrían romper SportsCar inesperadamente
  1. A medida que la cadena de herencia crece, resulta más difícil rastrear de dónde provienen los métodos y las propiedades
  1. Te ves obligado a establecer relaciones «es-un» que quizá no sean lo bastante flexibles
challenge icon

Desafío

Completa el archivo Robot.js para que el robot funcione. Ahora mismo, el robot está construido, pero no puede hacer nada.

Qué hacer en Robot.js:

  1. Crea los componentes del altavoz y del motor dentro del constructor de Robot
  2. Usa los componentes en los métodos:
    1. En greet(): llama a this.speaker.speak("Hello!");
    2. En walkForward(): llama a this.mover.move("forward");

Por qué hacemos esto: Esto es composición: el robot se construye combinando componentes más pequeños. El robot tiene un altavoz (para hablar) y tiene un motor (para moverse), en lugar de heredar estas capacidades.

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 forward
quiz iconPonte a prueba

Esta 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

Practica por tu cuenta: Compilador de JavaScript online