Menu
Coddy logo textTech

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:

  1. Zmiany w klasie Vehicle mogą nieoczekiwanie zepsuć klasę SportsCar
  1. W miarę wydłużania się łańcucha dziedziczenia coraz trudniej śledzić, skąd pochodzą metody i właściwości
  1. Jesteś zmuszony do tworzenia relacji typu „jest-a”, które mogą nie być wystarczająco elastyczne
challenge icon

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>:

  1. Utwórz komponenty głośnika i modułu ruchu w konstruktorze klasy Robot
  2. Użyj komponentów w metodach:
    1. W greet(): wywołaj this.speaker.speak("Hello!");
    2. W walkForward(): wywołaj this.mover.move("forward");

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 forward
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator JavaScript online