それでは「継承」と「コンポジション」を組み合わせた実例を見てみましょう。今回はゲームのキャラクターが「武器を持つ」ケースです。
シナリオ
- キャラクターは共通の性質(名前・HP)を持つ → 継承で拡張
- 武器はキャラクターの一種ではなく「持ち物」 → コンポジションで組み合わせる
コード例
// 親クラス:キャラクター
class Character {
constructor(name, hp){
this.name = name;
this.hp = hp;
}
showStatus(){
console.log(`${this.name} のHPは ${this.hp}`);
}
}
// 子クラス:勇者(キャラクターを継承)
class Hero extends Character {
constructor(name, hp, weapon){
super(name, hp); // 親クラスのconstructorを呼ぶ
this.weapon = weapon; // 武器を「持っている」(コンポジション)
}
attack(){
if(this.weapon){
console.log(`${this.name} が ${this.weapon.name} で攻撃!`);
this.weapon.use();
} else {
console.log(`${this.name} は素手で攻撃!`);
}
}
}
// 武器クラス(キャラクターの一種ではないので継承しない)
class Weapon {
constructor(name, power){
this.name = name;
this.power = power;
}
use(){
console.log(`${this.name} を使って ${this.power} ダメージ!`);
}
}
// 実行例
let sword = new Weapon("伝説の剣", 50);
let hero = new Hero("アレン", 120, sword);
hero.showStatus();
// → アレン のHPは 120
hero.attack();
// → アレン が 伝説の剣 で攻撃!
// → 伝説の剣 を使って 50 ダメージ!
JavaScript🔑 ポイント
- HeroはCharacterの一種 → 継承(is-a関係)
- HeroはWeaponを持っている → コンポジション(has-a関係)
- 継承とコンポジションを組み合わせることで、柔軟で拡張性のある設計になる
✅ まとめ
- 継承:共通の性質をまとめる(キャラクターの基本機能)
- コンポジション:部品を組み合わせる(武器やアイテムなど)
- 両方を組み合わせると「再利用性が高く、現実に近い設計」ができる
💡 この考え方はゲームだけでなく、WebアプリのUI設計(ボタンがアイコンを持つ、フォームがバリデーション機能を持つ)などにも応用できます。
