Ograniczenia głębokiego dziedziczenia
Część sekcji Programowanie obiektowe ścieżki JavaScript w Coddy. Lekcja 48 z 56.
Choć dziedziczenie jest przydatne, tworzenie bardzo głębokich hierarchii dziedziczenia (rodzic → dziecko → wnuk → prawnuk) może prowadzić do problemów. Im dłuższy łańcuch, tym trudniej zrozumieć, utrzymywać i modyfikować kod.
Przyjrzyjmy się, co się dzieje przy głębokim łańcuchu dziedziczenia:
// Klasa bazowa
class Vehicle {
constructor(type) {
this.type = type;
this.isRunning = false;
}
start() {
this.isRunning = true;
console.log(`${this.type} started`);
}
}
// Pierwszy poziom dziedziczenia
class Car extends Vehicle {
constructor(make, model) {
super("Car");
this.make = make;
this.model = model;
this.wheels = 4;
}
honk() {
console.log("Beep beep!");
}
}
// Drugi poziom dziedziczenia
class SportsCar extends Car {
constructor(make, model, topSpeed) {
super(make, model);
this.topSpeed = topSpeed;
}
race() {
this.start();
console.log(`Racing at ${this.topSpeed} mph!`);
}
}W tym przykładzie SportsCar znajduje się dwa poziomy niżej w hierarchii dziedziczenia. Może to prowadzić do kilku problemów:
- Zmiany w klasie Vehicle mogą nieoczekiwanie zepsuć klasę SportsCar
- W miarę wydłużania się łańcucha dziedziczenia coraz trudniej śledzić, skąd pochodzą metody i właściwości
- Jesteś zmuszony do tworzenia relacji typu „jest-a”, które mogą nie być wystarczająco elastyczne
Wyzwanie
Uzupełnij plik Robot.js, aby robot działał. Robot jest już zbudowany, ale nie może nic robić.
Co zrobić w <strong>Robot.js</strong>:
- Utwórz komponenty głośnika i modułu ruchu w konstruktorze klasy Robot
- Użyj komponentów w metodach:
- W
greet(): wywołajthis.speaker.speak("Hello!"); - W
walkForward(): wywołajthis.mover.move("forward");
- W
Dlaczego tak robimy: To jest kompozycja — robot jest zbudowany z mniejszych komponentów. Robot ma głośnik (do mówienia) i ma moduł ruchu (do poruszania się), zamiast dziedziczyć te umiejętności.
Spróbuj swoich sił
import { Robot } from './Robot.js';
const myRobot = new Robot('Robo');
myRobot.greet(); // Powinno wypisać: Saying: "Hello!"
myRobot.walkForward(); // Powinno wypisać: Moving forwardTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Obiekty i słowo kluczowe this
Szybka powtórka: obiektyDodawanie metod do obiektówZrozumienie słowa kluczowego thisFunkcje konstruktoraSłowo kluczowe newWyzwanie podsumowujące7Dziedziczenie i słowo kluczowe extends
DziedziczenieRelacja „jest rodzajem”Słowo kluczowe extendsMetoda super()Dziedziczenie właściwości i metodWyzwanie podsumowujące10Polimorfizm
Czym jest polimorfizm?Nadpisywanie odziedziczonych metodUżywanie superWyzwanie podsumowujące13Kompozycja a dziedziczenie
Relacja „ma” a relacja „jest”Ograniczenia głębokiego dziedziczeniaTworzenie obiektów2Organizowanie kodu
Czym są moduły?Eksportowanie za pomocą exportImportowanie za pomocą importEksporty domyślne a nazwane5Enkapsulacja i dostęp
EnkapsulacjaPubliczne i prywatne pola klasyMetody prywatneWyzwanie podsumowujące8Organizowanie kodu OOP
Organizowanie klas w moduły11Projekt: Renderer kształtów
Konfiguracja: klasa Shape i eksportDziedziczenie klasy CircleNadpisywanie i metoda obliczania polaStatyczny licznik kształtów14System zarządzania biblioteką
Projektowanie bibliotekiKlasa Book z kompozycjąWalidacja autora książki9Metody i właściwości statyczne
Poziom klasy a poziom instancjiWłaściwości statyczneStatyczne metody pomocniczeWyzwanie podsumowującePoćwicz samodzielnie: Kompilator JavaScript online