Java Basic インターフェース 〜Step2_3 〜

イントロダクション

インターフェース・クラスや、
ポリモーフィズムについて学習していきます。
ポリモーフィズムは、日本語で「多様性」と言う意味らしいです。
インターフェースクラスの前に通常のクラスについて理解したい場合は、こちらの記事を参照ください。

ポリモーフィズムの使用例

よく聞く「デザインパターン」と言うのはこのポリモーフィズムを応用した設計手法のことです。

<インターフェースクラスの使い方サンプル>

余談

JavaAPIの中にはすでに実装されています、
Listインターフェース・クラスにある。iterate()はイテレートパターンと言うデザインパターンの実装になります。

インターフェース・クラス

インターフェース・クラスに関してはListインターフェースがこれにあたります。まずはこのインターフェースクラスを見てみましょう。

List<String> list = new ArrayList<String>();

List<String> list = new LinkedList<String>();

上のように、別クラスを同じ型(クラス)変数として使用することができます。

これがまずは、基本的な考え方になります。これは、ArrayListがListインターフェイスをimplementsしているのでこのような使い方が出来ます。JavaDocを見ると他にも実装(implements)しているクラスを確認できます。

インターフェースクラスを作成すると、このインターフェースクラスを一つのグループとして使用することができます。

ListインターフェースクラスのJavaDocを見てみると「既知の実装クラス」の部分にあるクラスが実装(implements)しているクラスです。つまり1つのグループとして扱うことができるというわけです。

自作のインターフェースを使う

自作のインターフェースを使ってみます。
概要としては以下のようなクラスを用意します。

  1. TestIF(インターフェース)
  2. TestCls1(インターフェースの実装クラス)
  3. TestCls2(インターフェースの実装クラス)

なお、各実装は以下のように定義します。作成したメソッドには処理の実体がありません。このようなメソッドを抽象メソッドと呼び、「abstract」をつけるのですが、インターフェイスクラスではつけなくても良いことになってます。その代わり抽象クラスを作った時は「abstract」を付ける必要があります。
<TestIF>

public interface TestIF {
    // 抽象メソッドを定義、処理の中身はなし
    public abstract void hello();
    // 上と同じように抽象メソッドの定義
    public void execute();
}

インターフェイスのメソッドをオーバライドして処理の実体を作成します。
<TestCls1>

public class TestCls1 implements TestIF {
    @Override
    public void hello() {
        System.out.println("Hello World");
    }
    @Override
    public void execute() {
        int ans = 1 + 1;
        System.out.println("足し算の結果: " + ans);
    }
}

<TestCls2>

public class TestCls2 implements TestIF {
    @Override
    public void hello() {
        System.out.println("Good morning World");
    }
    @Override
    public void execute() {
        int ans = 5 * 2;
        System.out.println("掛け算の結果: " + ans);
    }
}

これを、変数testに格納して起動してみます。コードは下のようなものです。

public static void main(String[] args) {
    // インターフェースクラスを宣言する
    TestIF test1 = new TestCls1();
    test1.hello();
    TestIF test2 = new TestCls2();
    test2.hello();
}

実行結果

それぞれ、「Hello World」と「Godd morning World」が表示されます。
このように、インターフェースクラスを使用して、一つのクラス型(データ型)でいろんな処理を実装することを「多様性」という意味の
ポリモーフィズムという言葉が使用されています。しかし、エンジニア同士の会話の中で認識を合わせるための言葉なので
自分なりのちゃんとした理解があれば、認識を合わせることができると思います。

「単語」にとらわれていると「スタティックおじさん」事件のように、カオス化してしまうので注意しましょう。

Gitにアップしたソースについて

作成したクラスなどは、Githubにアップしてあるのでそちらを参照ください。ルートになるフォルダはこちらになります。
作成したものjp.zenryoku.sample.basic.lv2パッケージになります。※上記のものと違っているかもしれません。

インターフェースの書き方

public interface インターフェース名 {
   /** 抽象メソッドの定義 */
   // implementsするクラスで処理内容を記述
   public abstract void execute();
  // 上のメソッドと同じ(メソッド名は違う)
   public void setName();
}

クラスへの実装(implements)方法

public class クラス名 implements インターフェース {
   // クラスの記述
   // 上記の抽象メソッドを実装する
  @Orverride
   public 抽象メソッド() {
      //処理
  }
}

インターフェースを使用した。
サンプルコードには上記の実装方法を使用しています。
実際の使用の仕方はサンプルを見てください。

インターフェースを実装したクラスは、そのインターフェース型の
変数として使用することができます。
つまり、同じ名前のメソッドを呼び出した時に違う処理を実行することがでいます。
下の「action()」の実行結果が以下になります。
listにはPlayer型のクラスが設定されています。
処理詳細は、サンプルコードをご覧ください。

作成したインターフェースクラスを今後作成するクラスに実装(implements)することで、下のようなコードでどのクラスの「execute()」メソッドも実行することができます。

public void test() {
   // SomeClsにTestIFを実装(implements)した場合
   TestIF ttt = new SomeCls();
   ttt.execute();
   ttt.hello();
   // OtherClsにTestIFを実装(implements)した場合
   TestIF tt1 = new OtherCls();
   tt1.execute();
   tt1.hello();
}

CommandIFを使ったポリモーフィズム

CommandIFというインターフェースクラスを作成し、これを実装(implements)したクラスを、入力した文字列によって呼び出す形のプログラムを実装しました。参考にどうぞ

次回、これだけではわかりづらいかもしれないので
他もパターンも記載いたします。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す