「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"(コンポジション):車はエンジンを持っている
チャレンジ
コンポーネントクラス(Processor、Memory)と、Computer クラスの大部分が提供されています。あなたのタスクは、computer.js ファイル内のコンストラクタを完成させることです:
Processorクラスを使用してprocessorプロパティを作成しますMemoryクラスを使用してmemoryプロパティを作成します- 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();このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。