JavaScript | classの継承(extends)

JavaScript JavaScript
スポンサーリンク

それでは「継承」と「コンポジション」を組み合わせた実例を見てみましょう。今回はゲームのキャラクターが「武器を持つ」ケースです。


シナリオ

  • キャラクターは共通の性質(名前・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設計(ボタンがアイコンを持つ、フォームがバリデーション機能を持つ)などにも応用できます。

タイトルとURLをコピーしました