abstractなメソッドによる機能の分離

abstract のメソッドの使用例を紹介します。
やはり簡単なパズルゲームをサンプルにします。 その中に登場するクラスのうち、ゲームの開始や実行中の基本的な処理を 組み込んだ クラス ActionBoard があります。
このクラスは次のような abstractなメソッドを用意します。 従って、ActionBoard自身が abstract なクラスとなります。


/** ゲーム進行の骨組みを組み込んだActionBoardクラス */

abstract public class ActionBoard extends CellBoard implements Runnable {

    /** 拡張クラスでゲームの内容を組み込むためのメソッド */

        abstract public void dropSomething();

    /** 拡張クラスでゲームの内容を組み込むためのメソッド */

        abstract public void clearSomething();
                         :
                         :
                         :

この2つのメソッドは内容が定義されていません。 ただし、次のように他のメソッドの中で呼び出すことができます。


    /** スレッドとして行われる処理 */

        public void run() {

              while( timer.isAlive() ) {
                    if( !startFlag ) {   // ゲーム開始
                          startFlag = true;
                          restartGame();
                    }
                    else if( isGameOver() ) {   // 再ゲーム開始
                          restartGame();
                    }
                    else{   // ゲーム進行中
                          switch( gameMode() ) {
                                case DROP_MODE:
                                      dropSomething();
                                      pause();
                                      break;
                                case CLEAR_MODE:
                                      clearSomething();
                                      break;
                          }
                    }
              }
        }

上の記述はの意味を考えてみましょう。ActionBoardの run()では、 ゲーム進行中の間 dropSomething() か clearSomething() の処理が 実行されます。これらは「ブロックが落下中の処理」と 「ブロックを消去するための処理」と解釈できます。 この処理のパターンは、「テトリス」に似たゲームに共通するものです。 ただし、それらの詳細はまだ決められてはいません。 dropSomethin() と clearSomthing()の内容は、 ActionBoardを拡張したクラスの中で自由に定義することができます。

つまり、abstract なメソッドを導入することで、ゲームの基本的な処理の部分と、 ゲームの細かいルールの部分を分離することが可能になったわけです。 ActionBoardは、現在開発中のゲームだけでなく、他の良く似た種類のゲームの プログラムの中でも再利用することができるのです。