Menu
Coddy logo textTech

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

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

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

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

// Базовый класс
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 находится на два уровня ниже в иерархии inheritance. Это может привести к нескольким проблемам:

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

Задание

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

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

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

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

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

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

const myRobot = new Robot('Robo');

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

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

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

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