Menu
CoddyTech

Ограничения глубокого наследования

Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy. Урок 48 из 56.

Хотя наследование полезно, создание очень глубоких иерархий наследования (родитель → потомок → внук → правнук) может привести к проблемам. Чем длиннее цепочка, тем сложнее понимать, поддерживать и изменять код.

Посмотрим, что происходит при глубокой цепочке наследования:

// Базовый класс
class Vehicle {
  constructor(type) {
    this.type = type;
    this.isRunning = false;
  }
  
  start() {
    this.isRunning = true;
    console.log(`${this.type} started`);
  }
}

// Первый уровень наследования
class Car extends Vehicle {
  constructor(make, model) {
    super("Car");
    this.make = make;
    this.model = model;
    this.wheels = 4;
  }
  
  honk() {
    console.log("Beep beep!");
  }
}

// Второй уровень наследования
class SportsCar extends Car {
  constructor(make, model, topSpeed) {
    super(make, model);
    this.topSpeed = topSpeed;
  }
  
  race() {
    this.start();
    console.log(`Racing at ${this.topSpeed} mph!`);
  }
}

В этом примере SportsCar находится на два уровня ниже в иерархии наследования. Это может привести к нескольким проблемам:

  1. Изменения в Vehicle могут неожиданно нарушить работу SportsCar
  1. По мере роста цепочки наследования становится сложнее отслеживать, откуда берутся методы и свойства
  1. Ты вынужден использовать отношения «является» (is-a), которые могут быть недостаточно гибкими
challenge icon

Задание

Заверши файл Robot.js, чтобы робот стал функциональным. Сейчас робот собран, но ничего не умеет.

Что нужно сделать в Robot.js:

  1. Создай компоненты динамика и движителя внутри конструктора Robot
  2. Используй компоненты в методах:
    1. В greet(): вызови this.speaker.speak("Hello!");
    2. В walkForward(): вызови this.mover.move("forward");

Зачем мы это делаем: Это композиция — робот создаётся путём объединения небольших компонентов. У робота есть динамик (для разговора) и есть движитель (для перемещения), вместо того чтобы наследовать эти возможности.

Попробуйте сами

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

const myRobot = new Robot('Robo');

myRobot.greet();     // Должно вывести: Saying: "Hello!"
myRobot.walkForward(); // Должно вывести: Moving forward
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор JavaScript