インターフェイスによる機能の分離

複雑なクラスの機能は、 たいていの場合いくつかの独立した機能に分けることができます。 それを形式的に行うためにインターフェイスを導入してみましょう。
ここで紹介するのは簡単なパズルゲームの中に登場するクラスです。 ゲーム版の升目に相当する クラス Cell と、複数の Cellから構成される クラス Trash があります。

Trash の基本的な機能は、その内部に含まれる Cellの情報を管理し、 Trash 自体の形状と色を記憶しておくことです。 この他に、ゲームのルールの要請によって、Trashは特定の規則に当てはまる Cellは消去の対象になるとしましょう。 この「Cellの消去を行う」という機能を最初から Trash に組み込むことも可能 ですが、ここでは別の インターフェイス Clearable によって定義することにします。


/** セルの消去のルールを組み込むためのインターフェイス */

public interface Clearable {

    /** セルの消去を実行するメソッド */

        abstract public boolean clearCells();
}

インターフェイスに定義されるメソッドは全て abstract です。 中身の定義はありません。上の例では clearCells() という名前の メソッドがそれにあたります。このメソッドの内容は、 上のインターフェイスを実装するクラスの中で記述する必要があります。
たとえば、Trashクラスを拡張し、Clearableの機能を実装した クラス ClearableTrash を設計するとしましょう。最低限、以下のような記述が必要になります。

/** 消去のルールを組み込んだClearableTrashクラス */

public class ClearableTrash extends Trash implements Clearable{

    /** 消去を実行するメソッド
     *  クリアすべきセルが見つからないとfalseを返す */

        public boolean clearCells(){

             if( !checkClear() ) return false;
             copyStates( state, old_state );
             for( int i=0; i<iMax; i++ )
                  for( int j=0; j<jMax; j++ )
                       if( toBeClear[i][j] ) {
                            state[i][j] = EMPTY;
                            toBeClear[i][j] = false;
                       }
             moveCells();
             checkRepaint();
             return true;
        }
                          :
                          :
}