インターフェースの実装
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 35/87。
インターフェースを使用するには、クラスは implements キーワードを使用してそれを実装する必要があります。その後、クラスはインターフェースで宣言されたすべてのメソッドに対して具体的な実装を提供します:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}クラスがインターフェースを実装しているが、そのすべてのメソッドの実装を提供していない場合、コンパイラはエラーをスローします。@Overrideアノテーションは任意ですが、ミスを防ぐのに役立つため、使用が推奨されます。
抽象クラスと同様に、インターフェースを参照型として使用できます。これにより、同じインターフェースを実装する異なるクラスを一律に扱うことができるポリモーフィズムが可能になります。
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // 半径 5.0 の円を描画しています
shape2.draw(); // 4.0 x 3.0 の長方形を描画していますDrawable の参照を扱うコードは、具体的なクラス型を知る必要がないため、これは強力です。オブジェクトが描画可能であることだけを気にすればよいのです。
次のレッスンでは、単一のクラスが複数のインターフェースを同時に実装する方法を見ていきます。
チャレンジ
簡単クラスがインターフェースをどのように実装するかを実演するスピーカーシステムを構築しましょう。まず、あらゆるスピーカーができることを定義するインターフェースを作成し、次にそのコントラクトを独自の方法で実装する2つの異なるスピーカータイプを構築します。
コードは4つのファイルに分けて構成します:
Speaker.java: あらゆるスピーカーが実行できなければならないことを宣言する、Speakerという名前のインターフェースを定義します。すべてのスピーカーは、Stringを返すspeak()メソッドを持つ必要があります。これが、すべての実装クラスが満たさなければならないコントラクトです。Human.java:Speakerインターフェースを実装するクラスを作成します。Humanはnameフィールド(String)を持ちます。名前を初期化するためのコンストラクタを含め、speak()メソッドを実装して、[name] says: Hello everyone!を返すようにします。Robot.java:Speakerインターフェースを実装する別のクラスを作成します。Robotはmodelフィールド(String)を持ちます。モデルを初期化するためのコンストラクタを含め、speak()メソッドを実装して、Robot [model] says: Beep boop!を返すようにします。Main.java: インターフェースベースのポリモーフィズムを使用して、すべてをまとめます。2つの入力(人間の名前とロボットのモデル)を受け取ります。HumanとRobotを作成し、それらをSpeaker参照の配列に格納します。配列をループで回し、各スピーカーに対してspeak()を呼び出した結果を出力します。
入力として、人間の名前(String)とロボットのモデル(String)の2つを受け取ります。
出力は、各スピーカーにつき1行ずつ、計2行表示されるはずです。HumanとRobotが、全く異なる話し方をするにもかかわらず、Speakerインターフェースを通じて一律に扱えることに注目してください!
チートシート
クラスは implements キーワードを使用してインターフェースを実装し、インターフェースで宣言されたすべてのメソッドに対して具体的な実装を提供する必要があります:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}@Override アノテーションは任意ですが、間違いを見つけるのに役立つため推奨されます。
インターフェースは参照型として使用でき、同じインターフェースを実装する異なるクラスを均一に扱うことができるポリモーフィズムを可能にします:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // 半径 5.0 の円を描画
shape2.draw(); // 4.0 x 3.0 の長方形を描画自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: 指定された名前でHumanオブジェクトを作成する
// TODO: 指定されたモデルでRobotオブジェクトを作成する
// TODO: 両方のオブジェクトを含むSpeaker参照の配列を作成する
// TODO: 配列をループし、各スピーカーのspeak()の結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム