Ограничения глубокого наследования
Часть раздела Объектно-ориентированное программирование путешествия по 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. Это может привести к нескольким проблемам:
- Изменения в Vehicle могут неожиданно нарушить работу SportsCar
- По мере роста цепочки inheritance становится сложнее отслеживать, откуда берутся методы и свойства
- Тебя вынуждают использовать отношения «является», которые могут оказаться недостаточно гибкими
Задание
Заполни файл Robot.js, чтобы робот стал функциональным. Сейчас робот создан, но ничего не умеет делать.
Что нужно сделать в <strong>Robot.js</strong>:
- Создай компоненты speaker и mover внутри конструктора Robot
- Используй компоненты в методах:
- В
greet(): вызовиthis.speaker.speak("Hello!"); - В
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса CircleПереопределение и метод AreaСтатический счетчик фигур14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композицииВалидация автора книги6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средствБаланс как приватное поле9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закреплениеПотренируйтесь самостоятельно: Онлайн-компилятор JavaScript