Menu
Coddy logo textTech

Отношения «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" (композиция): У Машины ЕСТЬ Двигатель
challenge icon

Задание

Вам предоставлены классы компонентов (Processor, Memory) и большая часть класса Computer. Ваша задача — завершить конструктор в файле computer.js:

  1. Создайте свойство processor, используя класс Processor
  2. Создайте свойство memory, используя класс Memory
  3. Передайте 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();
quiz iconПроверьте себя

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

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