Java Basic Class Inheritance ~クラスの継承関係を作る2:抽象クラス~

イントロダクション

前回作成したクラスを使用して実装してきます。ちなみに前回は、クラスの親子関係を作成したラドのように動くのか?に関して記載しまた。

前回の学習概要

次のようなことを学習しました。

親クラスと子クラスを実行イメージ

JFrameを継承してpaint()をオーバーライド

抽象クラスのサンプル

Calenderクラスは抽象クラスです。このクラスをインスタンス化するときは「Calender.getInstance()」を使用します。
このような呼び出し方を「stataic」呼び出しと呼んでいますが、一般的かどうかは怪しいです。。。
つまりstaticメソッドでインスタンスを取得するメソッドを使用して抽象クラスのインスタンスを取得する例としてCalendarクラスを紹介しました。

作成したクラス

作成したクラスは以下のものです。

  • Parent: 親クラス
  • ChildAni: 子クラス
  • ChildOtoto: 子クラス
  • MainFamilly: メインメソッドを持っているクラス

実行するクラスは「MainFamilly」クラスのメインメソッドです。

とりあえずは実行すると下のようなイメージで動きます。

そして、抽象クラスを追加しました。クラス名は「Gosenzo(ご先祖)」です、

感の良い方は気がついているかもしれませんが、以下のような系譜ができています。

  1. ご先祖
  2. あに、弟

ただし、抽象クラスのメソッド「血継限界」に関しては実行していません。単純に実装するのを忘れていました。
ソースに関してはこちらにあるので、ご自由に動かして見てください。※カスタムして遊んでもよし。

継承関係で遊ぶ

勝手に設定を作ってみます。

ご先祖から因縁を持っている魔物、スライム討伐が稼業になっている家族の物語、細かい話はスッ飛ばして宿敵スライムと対峙する家族であった。。。

というわけで、スライムとの戦いを始めたいと思います。

クラスの継承関係でRPG

つまりは、クラスの継承関係を作ることで、例えばですが、勇者、戦士、魔法使いなどのキャラクターを表現することができます。
例えば、PlayerクラスにHPなどの最低限必要なフィールド(プロパティ)を持たせておき、各職業で細かいプロパティを変更する。。。とか。
サンプルで作成したテキストRPGの戦闘シーンのみです

継承関係を理解するといろいろと遊びの幅が広がります。

抽象クラス「ご先祖様」

現在作成済みのクラスは上記のとおり4クラスあります。
そして、ご先祖クラスには、フィールドが「秘伝のタレ」しかありません。

なので、RPGっぽく作成するため以下のプロパティ(フィールド)を追加します。本当は「プレーヤー」クラスの方が良いのですが。。。

いや、プレーヤークラスを作成しましょう。
※GetterとSetterは省略しています。GetterSetterの作成方法は下の動画を参照ください。

ご先祖クラスにプレーヤークラスを継承する

Playerクラスは、RPGゲームをするときに使用するプロパティ(フィールド変数)を持っているクラスです。

  • HP
  • MP
  • Level
  • name

などなど。。。

public class Player {
    /** 名前 */
    private String name;
    /** レベル */
    private int level;
    /** 生命力 */
    private int HP;
    /** 特殊能力(技能)の使用時に消費 */
    private int MP;
    /** 攻撃力 */
    private int attack;
    /** 防御力 */
    private int diffence;
    /** 戦闘可能フラグ */
    private boolean canBattle;

    /**
     * コンストラクタ。
     * @param name
     */
    public Player() {
        this.name = "桃太郎";
        // レベル1の設定
        setLevel(1);
        setHP(20);
        setMP(10);
    }

    /**
     * コンストラクタ。
     * @param name
     */
    public Player(String name) {
        this.name = name;
        // レベル1の設定
        setLevel(1);
        setHP(20);
        setMP(10);
    }
}

このクラスをご先祖クラスの親にします。

public abstract Gosenzo extends Player { ... }

そうすると、MainFamillyのメインメソッドで、HPなどの設定ができるようになります。
<MainFamilly>

public class MainFamilly {
    public static void main(String[] args) {
        // 標準入力の受付
        Scanner scan = new Scanner(System.in);
        System.out.println("**** Game Start ****");
        // 親クラスのインスタンス
        Parent parent = new Parent();
        // HP
        parent.setHP(50);
        //戦闘可能フラグ
        parent.setCanBattle(true);
        //攻撃力
        parent.setAttack(20);
        //防御力
        parent.setDiffence(15);

        // 子クラス(あに)のインスタンス
        ChildAni ani = new ChildAni();
        // HP
        parent.setHP(40);
        //戦闘可能フラグ
        parent.setCanBattle(true);
        //攻撃力
        parent.setAttack(20);
        //防御力
        parent.setDiffence(15);
        // 子クラス(弟)のインスタンス
        ChildOtoto ototo = new ChildOtoto();
        // HP
        parent.setHP(30);
        //戦闘可能フラグ
        parent.setCanBattle(true);
        //攻撃力
        parent.setAttack(20);
        //防御力
        parent.setDiffence(15);
        while (true) {
            String input = scan.nextLine();
            if ("parent".equals(input)) {
                parent.say();
            } else if ("ani".equals(input)) {
                ani.say();
            } else if ("ototo".equals(input)) {
                ototo.say();
            } else {
                System.out.println("処理を終了します。");
                break;
            }
        }
    }
}

モンスターを作成する

モンスターといえど、HPなどはあるので、プレーヤークラスの子クラスとして作成することにします。
そして、「話をするかどうか?」のフラグを追加することにしました。
<モンスタークラス>

public class Monster extends Player {
    /** 話をするかどうか */
    private boolean isTalk;

    /**
     * @return the isTalk
     */
    public boolean isTalk() {
        return isTalk;
    }

    /**
     * @param isTalk the isTalk to set
     */
    public void setTalk(boolean isTalk) {
        this.isTalk = isTalk;
    }
}

そして、具体的なモンスタークラスを作成します。
つまり、スライムクラスを作成します。

<スライムクラス>

public class Slime extends Monster{
    public Slime() {
        this.setCanBattle(true);
        this.setHP(10);
        this.setMP(5);
        // 攻撃力
        this.setAttack(5);
        // 防御力
        this.setDiffence(5);
    }
}

ここまで作成したら、次は戦闘シーンを作成したくなると思います。

頑張って見てください。

自分が作成したものは次回、記事に記載いたします。

<<< 前回

関連ページ一覧

Eclipse セットアップ(Mac版)

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜

コメントを残す