それでは「継承を使うときの注意点」と「コンポジションとの使い分け」について整理してみましょう。ここを理解すると、オブジェクト指向を“賢く”使えるようになります。
⚠️ 継承を使うときの注意点
- 1. 継承の多用は危険
- 子クラスが親クラスに強く依存するため、親を変更すると子も影響を受けやすい
- 「親子関係が複雑になりすぎる」とコードが読みにくくなる
- 2. 「is-a」関係のときだけ使う
- 継承は「AはBの一種である(is-a)」が成り立つときに使う
- 例:犬(Dog)は動物(Animal)の一種 → 継承OK
- 例:車(Car)はエンジン(Engine)の一種ではない → 継承NG
- 3. オーバーライドの乱用に注意
- 子クラスで親のメソッドを上書きしすぎると、親の設計を壊してしまう
- 「親のメソッドをそのまま使える」ことが継承の強みなので、上書きは必要最小限に
🔄 コンポジションとの使い分け
コンポジション(合成)とは「部品を組み合わせて機能を作る」考え方です。
👉 「has-a(〜を持っている)」関係のときに使うのが基本。
例:車とエンジン
// エンジンは独立したクラス
class Engine {
start(){
console.log("エンジン始動!");
}
}
// 車は「エンジンを持っている」
class Car {
constructor(){
this.engine = new Engine();
}
drive(){
this.engine.start();
console.log("車が走り出した!");
}
}
let car = new Car();
car.drive();
// → エンジン始動!
// → 車が走り出した!
JavaScript- 車は「エンジンの一種」ではないので継承は不適切
- 「エンジンを持っている」のでコンポジションが正解
✅ まとめ
- 継承は「is-a」関係(犬は動物の一種)で使う
- コンポジションは「has-a」関係(車はエンジンを持っている)で使う
- 継承を多用すると依存関係が複雑になりやすいので、まずはコンポジションを検討するのが安全
💡 初心者へのアドバイス:
- 「これは本当にis-a関係か?」と自問してから継承を使う
- 迷ったらまずはコンポジションで組み立てる方が柔軟
