Отношения «has-a» и «is-a»
Часть раздела Объектно-ориентированное программирование путешествия по JavaScript на Coddy — урок 47 из 56.
В объектно-ориентированном программировании существует два основных типа отношений между объектами: «has-a» (композиция) и «is-a» (наследование). В то время как наследование создает иерархии «родитель-потомок», композиция строит объекты путем объединения более мелких, специализированных компонентов.
Давайте сначала разберем отношение «is-a» (является) через наследование:
class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(`${this.name} is eating.`);
}
}
// Dog "is-a" Animal — отношение наследования
class Dog extends Animal {
bark() {
console.log(`${this.name} says woof!`);
}
}Теперь давайте рассмотрим отношение «has-a» через композицию:
class Engine {
start() {
console.log("Engine started");
}
}
// Car "has-a" Engine — отношение композиции
class Car {
constructor() {
this.engine = new Engine(); // Композиция
}
startCar() {
this.engine.start();
console.log("Car is running");
}
}Ключевое различие:
- "is-a" (наследование): Собака ЯВЛЯЕТСЯ Животным
- "has-a" (композиция): У Машины ЕСТЬ Двигатель
Задание
Вам предоставлены классы компонентов (Processor, Memory) и большая часть класса Computer. Ваша задача — завершить конструктор в файле computer.js:
- Создайте свойство
processor, используя классProcessor - Создайте свойство
memory, используя классMemory - Передайте processorSpeed в конструктор Processor, а memorySize — в конструктор Memory
Шпаргалка
В объектно-ориентированном программировании существует два основных типа отношений между объектами:
- Отношение «is-a» (наследование): создает иерархии «родитель-потомок», где подкласс расширяет родительский класс
- Отношение «has-a» (композиция): создает объекты путем объединения более мелких, узкоспециализированных компонентов
Пример наследования («is-a»):
class Animal {
constructor(name) {
this.name = name;
}
eat() {
console.log(`${this.name} is eating.`);
}
}
// Dog «is-a» Animal
class Dog extends Animal {
bark() {
console.log(`${this.name} says woof!`);
}
}Пример композиции («has-a»):
class Engine {
start() {
console.log("Engine started");
}
}
// Car «has-a» Engine
class Car {
constructor() {
this.engine = new Engine(); // Композиция
}
startCar() {
this.engine.start();
console.log("Car is running");
}
}Попробуйте сами
import { Computer } from './computer.js';
const myComputer = new Computer(3.5, 16);
myComputer.start();В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Объекты и ключевое слово this
Краткий обзор: ОбъектыДобавление методов в объектыПонимание ключевого слова thisФункции-конструкторыКлючевое слово newИтоговое испытание7Наследование и ключевое слово extends
НаследованиеОтношение «is-a»Ключевое слово extendsМетод super()Наследование свойств и методовИтоговое испытание10Полиморфизм
Что такое полиморфизм?Переопределение унаследованных методовИспользование superИтоговое задание13Композиция против наследования
Отношения «has-a» и «is-a»Ограничения глубокого наследованияСоздание объектов2Организация кода
Что такое модули?Экспорт с помощью exportИмпорт с помощью importDefault против именованных экспортов5Инкапсуляция и доступ
ИнкапсуляцияПубличные и приватные поля классовПриватные методыЗадание на повторение8Организация кода ООП
Организация классов в модули11Проект: Отрисовщик фигур
Настройка: Класс Shape и экспортНаследование класса Circle14Система управления библиотекой
Проектирование библиотекиКласс Book с использованием композиции6Проект: Простой банковский счет
Класс BankAccountПополнение и снятие средств9Статические методы и свойства
Уровень класса против уровня экземпляраСтатические свойстваСтатические вспомогательные методыЗадание на закрепление