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ù la catena è profonda, 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à nella gerarchia di ereditarietà. Questo può causare diversi problemi:
- Le modifiche a Vehicle potrebbero causare inaspettatamente malfunzionamenti in SportsCar
- Man mano che la catena di ereditarietà cresce, diventa più difficile tenere traccia della provenienza dei metodi e delle proprietà
- Sei costretto a ricorrere a relazioni "è-un" che potrebbero non essere abbastanza flessibili
Sfida
Completa il file Robot.js per rendere operativo il robot. Al momento, il robot è costruito ma non può fare nulla.
Cosa fare in <strong>Robot.js</strong>:
- Crea i componenti speaker e mover all'interno del costruttore di Robot
- Usa i componenti nei metodi:
- In
greet(): chiamathis.speaker.speak("Hello!"); - In
walkForward(): chiamathis.mover.move("forward");
- In
Perché lo facciamo: questa è la composizione: il robot è costruito combinando componenti più piccoli. Il robot ha un speaker (per parlare) e ha un 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 forwardQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Oggetti e la keyword this
Ripasso rapido: oggettiAggiungere metodi agli oggettiCapire la keyword thisFunzioni costruttriciLa keyword newSfida di ripasso7Ereditarietà e parola chiave extends
EreditarietàLa relazione «è un»La parola chiave extendsIl metodo super()Ereditare proprietà e metodiSfida di ripasso13Composizione vs. ereditarietà
«Ha-un» vs. «è-un»I limiti dell’ereditarietà profondaCostruire oggetti2Organizzare il codice
Cosa sono i moduli?Esportare con exportImportare con importExport predefiniti vs. export nominati5Incapsulamento e accesso
IncapsulamentoCampi di classe pubblici e privatiMetodi privatiSfida di riepilogo8Organizzare il codice OOP
Organizzare le classi in moduli11Progetto: Un renderizzatore di forme
Configurazione: classe Shape ed esportazioneEreditarietà della classe CircleOverride e metodo areaContatore statico di Shape14Sistema di gestione della biblioteca
Progettare la bibliotecaClasse Book con composizioneValidazione dell'autore del libroEsercitati da solo: Compilatore JavaScript online