Java Basic インターフェース・抽象クラスの作り方

イントロダクション

抽象クラスを使って見ようと思います。まずは抽象クラスってなに?と疑問に思う人もいると思うので簡単に説明しますと

抽象クラス

普通のクラスに抽象メソッドを持てるようにしたクラスです。何が違うのか?というと必ず子クラスを作る必要があり、このクラスは、newてきません。

どう使うんだ?と思う人もいるかもですが例えば、
抽象クラスのモンスタークラスを作ったとしましょう。

しかしモンスターの種類はたくさんあります。そして攻撃の方法も多岐にわたります。

こんな時「攻撃」メソッドを抽象メソッドにして子クラスのスライムクラスで、「攻撃」メソッドをオーバライドしてやればモンスターの攻撃でも、スライムの攻撃にすることができます。

下の動画は、抽象メソッドを持つインターフェイスクラスを使って、抽象メソッドのexecuteを実行するけど、処理内容が色々ある処理を実行しました。

やってみた!CommandIF(自作インターフェース)を作る

余計な音が入っています。

インターフェース・クラスの作成方法

/** インターフェースの作成 */
public interface A {
   // 抽象メソッドを定義します。
   public abstract void test01();
   // 上と同様
   public void test02();
   // 引数など書き方は普通のメソッドと一緒
   public String test03(int i);
}

抽象クラスの作成方法

/** 抽象クラスの作成 */
public abstract class A {
    // 抽象メソッドはインターフェースと同じ
    public abstract void test01();
    // 通常のメソッドの実装もOK
    public void test02() {
       System.out.println("Hello");
    }
    public A() {
       // コンストラクタ
    }
}

上の抽象クラスは、親クラスとして定義して、こクラスで似た様な処理
なんども同じ処理を呼び出したいときに使用します。

/** 子クラスサンプル */
public B extends A {
    // 親クラスの抽象メソッドをオーバーライドする必要がある
  @Override
    public void test01() {
     // 親クラスのメソッドを呼び出す
        test02();
    }
    // そのほかのメソッドなど
}

上記の様に親子関係を作成し、「A家」でtest01()の伝統を引き継いでいく・・・
みたいな感じです。
GOFのデザインパターン」などを見ると参考になると思います。

インターフェースと抽象クラスの違い

インタフェースは、実体のあるメソッドを持てない。抽象クラスは実体のあるメソッドを持てる。

/** 抽象メソッドは実体がない */
public abstract virtualMethod();

/** 実体のあるメソッド */
public void realMethod() {
    System.out.println("Real method")l;
}

ポリモーフィズム

ポリモーフィズムは、一つのメソッドでいろいろなデータ型を使えるようにするということです。
具体的には、メソッドの引数にインタフェースを宣言して作成してみましょう。

public void porimo(List<? extends Object> list) {
    /// 何かしらの処理
}

自作のCommandIF(インタフェース)を使用したポリモーフィズムの実行動画があります。

関連ページ一覧

<Java Basic>

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜「四則計算」
  3. Java Basic Level3 〜About String class〜「Stringクラス」
  4. Java Basic Level 4〜Boolean〜「TrueとFalse」
  5. Java Basic Level 5〜If Statement〜「IF文の書き方など」
  6. Java Basic Summary from Level1 to 5「Level1〜5までの複合技」
  7. Java Basic Level 6 〜Traning of If statement〜「IF文の練習」
  8. Java Basic Level8 〜How to use for statement〜「For文の使い方」
  9. Java Basic Level 8.5 〜Array〜「配列について」
  10. Java Basic Level 10 〜While statement 〜「While文について」
  11. Java Basic Swing〜オブジェクト指向〜「オブジェクト指向の考え方1」
  12. Java Basic Swing Level 2〜オブジェクト指向2〜「同じく、考え方2」

<クラスの種類>

http://zenryokuservice.com/wp/2018/05/14/java-basic-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%81%AF-inputsreamreader%E3%80%9Cstep2_1%E3%80%9C/

<インターフェース>

http://zenryokuservice.com/wp/2018/06/01/java-basic-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%83%BB%E6%8A%BD%E8%B1%A1%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/

<実装サンプル>

http://zenryokuservice.com/wp/2018/06/16/java-bassic-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91-%E3%80%9C%E3%82%B5%E3%83%B3%E3%83%97%E3%83%ABrpgmain%E3%82%AF%E3%83%A9%E3%82%B9%E3%80%9C/

http://zenryokuservice.com/wp/2018/05/20/java-basic-%E3%83%9F%E3%83%8B%E3%82%B2%E3%83%BC%E3%83%A0%E4%BD%9C%E6%88%90-%E3%80%9C%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%82%B2%E3%83%BC%E3%83%A0%E3%80%9C/

Java Basic ミニゲーム作成 〜コンソールゲーム〜

イントロダクション

コマンドプロンプト(Windows), ターミナル(Mac, Linux)で文字ベースでのゲームを作成しようと試みました。結局ゲームの内容までは届きませんでしたが、入力〜出力までの一連の流れを実装しました。

つまり、ゲームのイメージがあればこのまま完成まで行けるのでは?

別物ですが、こんなものも作ってみました。

Console app sanple....

Introduction

I will create a text based game on terminal or command prompt. But I implemented only from Input to output.

I mean if you have idea then you can implement game?

 

実際に作ったもの

作成したJarファイルはこちらです。ダウンロードして「java -jar ファイル名」の形でコマンドをたたいて動かすことができます。
コマンドプロンプトから起動してください。

Macの場合はターミナルです。コマンドは下のように使います。コマンドの実行例です。
ダウンロードしたディレクトリに移動

  1. cd ダウンロードしたディレクトリ
  2. java -jar ./CmdRpg.jarで起動することができます。
  3. GitからプロジェクトをそのままPullしてきてもおっけ
    プロジェクトのPull方法を参照してください。(Java Git clone in Eclipse 〜サンプルの取得〜)

ゲームの処理概要としては以下の様になります。ソースはこちら

/**
 * ゲームを起動する </br>
 * 標準入力の受付、「bye」コマンドでAPを終了する</br>
 *
 * @param args プログラム引数
 */
public static void main(String[] args) {
   // 初期化処理
   init();
   try {
      // ゲーム起動(GameLoop開始)
     gameLoop();
   } catch(IOException ie) {
      ie.printStackTrace();
   }
   // リソースの解放
   terminated();
}

このクラスは、どんどん拡張(追加で実装)できる様に
筆者なりに考えて作成いたしました。
これを土台にするもしないも自由にやってもらって結構です。

一応、記載しておきます。余計であれば読み飛ばしてください。

【考え方】

起動するメインメソッド→ゲームを起動する部分だけを記述したい。

Execute main method → I would like to write olnly game execution.

  1. メインメソッドから呼び出したい(処理の範囲を切り分け)
    処理を「staticメソッド」で定義。
  2. 処理を「初期化」
  3. 「ゲームループ」
  4. 「終了(リソース解放)」とカテゴリ分けをする。
  5. 静的メソッド(メインメソッドを含む)とメンバメソッドを切り分ける→
    staticが付いているものとそうでないものを使用方法のサンプルとして記述

Static method is called by main method → separates implementation as “init”, “game loop”, “terminated”.

Separates static and member method→as sample for use these.

staticはメインメソッドから直接呼べる

メンバメソッドはインスタンスを作ってからでないと呼べない。

 

フィールドとか、クラスなど、実際にはどの様に使うの?
って部分をソースの方に記載しています。
※わかりずらかったらゴメンなさい

private static void gameLoop() throws IOException{
   // mainメソッドと同様にクラスをnewする必要あり
   game = new RpgMain(); // コンストラクタで入力部品を生成
   /*
    *  <ゲームループ>
    *  1.入力
    *  2.データ更新、
    *  3.レンダリング(今回はコマンドなので文字出力)   
    *  4.「bye」コマンドでゲームを終了する
    */
    while(true) {
        String command = game.listenInput();
        // command変数がnullになる可能性があるため定数.equals()の形にする
        if(TERMINATE_GAME.equals(command)) {
             break;
        }
    System.out.println("コマンド入力値: " + command);
    }
}

プログラムの内容

ゲームを起動して、入力→「コマンド:入力値」を表示する
というシンプルなゲーム?です。
「bye」と入力するとゲーム終了となります。
ここで、コンストラクタを開設いたします。
コンストラクタ→newした時に起動する処理を定義する
メソッドの時と同じ様に引数を与えることができる。

詳細はおいおい理解していきましょう。

今回使用しているのは、
フィールド→staticのものとメンバフィールドがあります。
メソッド   →フィールドに同じ、newしてから使用するのが「メンバ」
メインメソッドから呼ばれているのがstaticです。

ソースに細かいコメントなどをつけております。
参考になればと思います。

カスタムするなら

上記のソース赤字の部分を修正してどの様に入力を受けて何を表示するか?

を自分で考えて作成するのも1つの方法です。

ちなみに、簡単なコンソールゲームを作って見ました。
余計な音が入っています。

プラスαの一覧

JavaDoc

    1. Java Doc 読解〜System.out〜
    2. JavaDoc 読解 〜 Filesクラス 〜
    3. Java Doc読解 BufferedReader
    4. Java Doc 読解〜BufferedWriter〜
    5. Java Doc 読解 List 〜JavaDocList その1〜
    6.  Java Doc 読解 Map

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3.  Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

JavaFX

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine〜

JUnit関連

  1. Java Basic JUnit 〜テストスイートの作り方〜

Git

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