Menu
CoddyTech

I limiti dell’ereditarietà profonda

Fa parte della sezione Programmazione orientata agli oggetti del percorso JavaScript di Coddy. Lezione 48 di 56.

Sebbene l'ereditarietà sia utile, creare gerarchie di ereditarietà molto profonde (genitore → figlio → nipote → pronipote) può causare problemi. Più lunga è la catena, più diventa difficile comprendere, mantenere e modificare il codice.

Vediamo cosa succede con una catena di ereditarietà profonda:

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

// Primo livello di ereditarietà
class Car extends Vehicle {
  constructor(make, model) {
    super("Car");
    this.make = make;
    this.model = model;
    this.wheels = 4;
  }
  
  honk() {
    console.log("Beep beep!");
  }
}

// Secondo livello di ereditarietà
class SportsCar extends Car {
  constructor(make, model, topSpeed) {
    super(make, model);
    this.topSpeed = topSpeed;
  }
  
  race() {
    this.start();
    console.log(`Racing at ${this.topSpeed} mph!`);
  }
}

In questo esempio, SportsCar si trova a due livelli di profondità nell’ereditarietà. Questo può causare diversi problemi:

  1. Le modifiche a Vehicle potrebbero compromettere inaspettatamente SportsCar
  1. Man mano che la catena di ereditarietà si allunga, diventa più difficile tenere traccia della provenienza dei metodi e delle proprietà
  1. Sei costretto a usare relazioni "è-un" che potrebbero non essere abbastanza flessibili
challenge icon

Sfida

Completa il file Robot.js per rendere funzionale il robot. Al momento, il robot è costruito, ma non può fare nulla.

Cosa fare in Robot.js:

  1. Crea i componenti speaker e mover all'interno del costruttore di Robot
  2. Usa i componenti nei metodi:
    1. In greet(): chiama this.speaker.speak("Hello!");
    2. In walkForward(): chiama this.mover.move("forward");

Perché lo facciamo: questa è composizione: il robot è costruito combinando componenti più piccoli. Il robot ha un componente speaker (per parlare) e ha un componente mover (per muoversi), invece di ereditare queste capacità.

Provalo tu

import { Robot } from './Robot.js';

const myRobot = new Robot('Robo');

myRobot.greet();     // Dovrebbe produrre: Saying: "Hello!"
myRobot.walkForward(); // Dovrebbe produrre: Moving forward
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore JavaScript online