【レポート】インタフェースの理解

【レポート】インタフェースの理解

目的

参照型の一種であるインタフェースを理解し、使えるようにする。

内容

授業中に作成したPlayerインタフェース以下を独自に拡張する。また、作成したクラスのjavadocの1部の画面キャプチャをつけること。

ソースプログラム

以下に、Playerインタフェース、Player2インタフェースと、この2つのインタフェースを実装したRegeneratorクラス、mainメソッドを含んだTester13クラスを以下に示す。

Playerインタフェース:

Player2インタフェース:

Regeneratorクラス:

Tester13クラス

実行結果

3のソースプログラムの実行結果を以下の図1に示す。

図1

javadoocの結果

以下に、Playerインタフェース、Player2インタフェース、Regeneratorクラス、Tester13クラスのjavadocの結果を以下の図1~9に示す。

Playerインタフェース:

図1
図2

Player2インタフェース:

図3
図4

Regeneratorクラス:

図5
図6
図7
図8

Tester13クラス:

図9
図10

考察

今回のプログラムのクラスの階層の図を以下に示した。

 上記の階層図は、Player、Player2,はインタフェースであり、RegeneratorクラスはPlayer、Player2インタフェースを実装するクラスである。ここで出てきたインタフェースとは、参照型の一種であり、クラスを「回路の設計図」に例えるのと同じ感じで表現すると、インタフェースは「リモコンの設計図」となる。Playerインタフェースを見てみると、宣言の部分がclassではなく、interfaceとなっている。Playerインタフェース内のメソッドは、play,stopメソッドだが、メソッド本体の{・・・}の代わりに;を付けて宣言している。よって、これらはクラスにおける抽象メソッドと同じだ。また、インタフェース内のすべてのメソッドは、publicかつabstractである。これをつけて宣言しても、つけなくて宣言してもなんの変わりもない。また、Player2インタフェースもメソッド名が違うだけで、中身はPlayerインタフェースと同じ。

 Player、Player2インタフェース内で宣言された抽象メソッドの実体はどこで定義するかというと、そのインタフェースを実装するクラスの中だ。実装の仕方は派生と似ていて、extendsの部分をimplementに変えるだけである。つまり、今回実装するクラスは、Regeneratorクラスである。Regeneratorクラスの中身を見てみると、メソッドの修飾子が全てpublicになっているがこれは、先程も述べた通りインタフェースのメソッドはpublicかつabstractだ。それよりもアクセス制限を強めることが出来ない為である。これは、クラスに派生におけるオーバライドの場合と同じだ。Regeneratorクラスの実装したメソッドを見てみると、playメソッドは「DVD再生開始」、stopメソッドは「DVD再生終了」、ffメソッドは「早送り」、rewメソッドは「巻き戻し」、poseメソッドは「一時停止」とそれぞれ表示する。ここで、注意したいのが、このクラスは、Player、Player2インタフェースのフィールドやメソッドなどの資産を継承しているのではないこと。受け継いでいるのは、Player、Player2インタフェースのメソッドの仕様である。

 MainメソッドをもつTester13クラスを見てみると、まずRegeneratorクラスのインスタンスを生成しているが、ここでインタフェース型のインスタンスを生成することはできない。その後は、System.out.printlnによって、”これからDVDを見ます”、”このDVDはどこのお店のですか?TUSTAYA・・・1  GEO・・・・2 そのほか・・・3″を出力し、1~3を自分で入力する。その際、もし1~3以外の値を入力した場合は、やり直すというのをdo文で作った。もしも、1~3のどれかを正しく入力できたら、breck文でdo文を抜け、r.play()で「DVD再生開始」と出力し、System.out.printlnによって、”~再生中~”を出力する。この後は、まず0~3、4つの乱数を発生させる。そして、出てきた0~3の乱数とif文をつかって、ランダムにDVDを見ている途中の動作を出した。

 今回プログラムのRegeneratorクラスの宣言の部分で

public class Regenerator implements Player,Player2{・・・}

と複数のインタフェースを同時に実装している。クラスの派生は単一継承しか認められていないのとは異なり、複数インタフェースの実装は可能。

 また、今回のプログラムでは使用していないが、インタフェース型の変数は、実装クラスのインスタンスを参照できたり、実装するインタフェースの全メソッドを実装しないクラスは、抽象クラスとして宣言しなければならない。また、インタフェースで宣言されたフィールドは、public、static、finalとなる。すなわち、値を書き換えることのできないクラス変数となる。クラスの派生をするextendsとクラスの実装をするimplementsの両方がある場合は必ずextendsを先に書かなければならない。

まとめ

 インタフェースのメンバは、クラス・インタフェース・定数・抽象メソッドである。インタフェースのメソッドは、publicかつabstractである。抽象メソッドである為、その本体は定義できない。インタフェースを実装するクラスでは、インタフェースの全メソッドをpublic修飾子を与えて実装する。全メソッドを実装しないクラスは、抽象クラスとして宣言しなければならない。クラスの派生と、インタフェースの実装を同時に行うことができる。また、複数のインタフェースを同時に実装することもできる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です