Menu
Coddy logo textTech

「has-a」対「is-a」

CoddyのJavaScriptジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 47/56。

オブジェクト指向プログラミングには、オブジェクト間の主要な関係として、「has-a」(コンポジション)と「is-a」(継承)の2種類があります。継承が親子階層を作成するのに対し、コンポジションは、より小さく特化したコンポーネントを組み合わせることでオブジェクトを構築します。

まずは継承による「is-a」関係について理解しましょう:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  eat() {
    console.log(`${this.name} is eating.`);
  }
}

// DogはAnimalである(is-a関係) - 継承関係
class Dog extends Animal {
  bark() {
    console.log(`${this.name} says woof!`);
  }
}

それでは、コンポジションによる「has-a」関係を見てみましょう:

class Engine {
  start() {
    console.log("Engine started");
  }
}

// 車はエンジンを「持っている(has-a)」 - コンポジション関係
class Car {
  constructor() {
    this.engine = new Engine(); // コンポジション
  }
  
  startCar() {
    this.engine.start();
    console.log("Car is running");
  }
}

主な違い:

  • "is-a"(継承):犬は動物である
  • "has-a"(コンポジション):車はエンジンを持っている
challenge icon

チャレンジ

コンポーネントクラス(ProcessorMemory)と、Computer クラスの大部分が提供されています。あなたのタスクは、computer.js ファイル内のコンストラクタを完成させることです:

  1. Processor クラスを使用して processor プロパティを作成します
  2. Memory クラスを使用して memory プロパティを作成します
  3. processorSpeed を Processor コンストラクタに、memorySize を Memory コンストラクタに渡します

チートシート

オブジェクト指向プログラミングにおいて、オブジェクト間には主に2つのタイプの関係があります。

  • "is-a" 関係(継承): サブクラスが親クラスを拡張する親子階層を作成します。
  • "has-a" 関係(コンポジション): より小さく、特定の機能に特化したコンポーネントを組み合わせることでオブジェクトを構築します。

継承の例 ("is-a"):

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  eat() {
    console.log(`${this.name} is eating.`);
  }
}

// DogはAnimalである ("is-a" 関係)
class Dog extends Animal {
  bark() {
    console.log(`${this.name} says woof!`);
  }
}

コンポジションの例 ("has-a"):

class Engine {
  start() {
    console.log("Engine started");
  }
}

// CarはEngineを持っている ("has-a" 関係)
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腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン