【C#】クラスの継承

目次

概要

長らくプログラミングをやっていくと、必ず部分的に共通の特徴を持つクラスが出てくる。
例としては、味方や敵のステータスには共通の項目としてHP、MP、攻撃力、防御力などだ。
しかし、それをそれぞれ別々に作るとどうなるだろう。
今後、アップデートを行なったときに新たなステータスが追加されたとき(属性など)、うっかり味方にだけ属性を追加して、敵に属性を追加し忘れたなんてことも起こりうる。

しかし、HP、MP、攻撃力、防御力といった基本となるステータスをまとめたクラスをあらかじめ作っておき、そのクラスを基盤に味方、敵のステータスのクラスをつくたらどうだろう?
新しく属性を追加する際、基本のステータスをまとめたクラスに一つ追加すれば全て追加できてバグ防止にもなる。

ソースコード

public class BaseStatus {
    protected int hp;
    protected int attack;
    protected int defense;
}
public class EnemyStatus : BaseStatus {
    private String item = "薬草";

    public void stolenItem() {
        if (this.item.Length > 0) {
            Console.WriteLine(this.item + "を盗んだ");
            item = "";
        } else {
            Console.WriteLine("何も持っていない");
        }
    }
}
using System.Net.NetworkInformation;
public class  PlayerStatus : BaseStatus {
    private String playerName;
    private int level;
    private List<String> items;

    public PlayerStatus(String playerName, int level, int hp, int attack, int defense) {
        this.playerName = playerName;
        this.level = level;
        this.hp = hp;
        this.attack = attack;
        this.defense = defense;
        this.items = new List<String>();
    }

    public String getPlayerName() {
        return playerName + "様";
    }

    public int getDamage(int youAttack, int myDefense) {
        Console.WriteLine("相手の攻撃力:" + youAttack);
        Console.WriteLine("自分の防御力:" + myDefense);

        this.updateHp(youAttack, myDefense);

        return youAttack - myDefense;
    }

    private void updateHp(int youAttack, int myDefense) {
        this.hp = this.hp - (youAttack - myDefense);
        Console.WriteLine("残りHP:" + this.hp);
    }
}
PlayerStatus playerStatus = new PlayerStatus("あなた", 1, 100, 100, 0);
Console.WriteLine("PlayerName: " + playerStatus.getPlayerName());
Console.WriteLine("Damage: " + playerStatus.getDamage(100, 10));

EnemyStatus enemyStatus = new EnemyStatus();
enemyStatus.stolenItem();
enemyStatus.stolenItem();

デモ動画

PlayerName: あなた様
相手の攻撃力:100
自分の防御力:10
残りHP:10
Damage: 90
薬草を盗んだ
何も持っていない

詳細

まず、クラスを継承する時は以下のように書く。

/* アクセス修飾子 */ class  /* クラス名 */ : /* 継承元のクラス名 */ {
    // クラスの中身
}

今回の場合、以下のようになっているわけだ。

項目内容
アクセス修飾子public
クラス名(継承先のクラス)EnemyStatus
継承元のクラス名BaseStatus

継承はどういうことかというと、継承元のクラスで定義したメソッドや変数を、継承先のクラスでも使えるということだ。もちろん、アクセス修飾子が「private」のものは使えないが。
こうすると、とても良いことがある。

例えば、ガメラの撮影画面を作りたい時、カメラのシャッター処理のメソッドやナイトモードかどうかの変数を自分で用意せず、特定のクラスを読み込むだけで良くなる。

ゲームで言えば、基本ステータスのクラスをあらかじめ作っておけば、そこから各キャラクターのクラスを作ることができる。
この時、次回作品を作るときに新しくステータスが追加されるときがあると思うが、
その時も基本ステータス(継承元のクラス)に手を加えるだけで各キャラクターのステータスを編集することができる。

こんな感じで、同じような定義をいくつも書く必要がなくなってとても便利だ!
また、特にスマホアプリでカメラ画面を作る時、カメラの撮影に関する知識がなくても既に用意されているクラスを使うことで簡単にカメラ画面を作ることができるのだ!

参考ページ

  • 「」
  • 「」