インターフェースの実装
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 35/87。
インターフェースを使用するには、class は 実装する必要があり、その際には implements キーワードを使用します。その後、class はインターフェースで宣言されているすべての method に対して具体的な実装を提供します。
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);
}
}class が interface を implements しているにもかかわらず、すべての method に対する実装を提供していない場合、コンパイラはエラーをスローします。@Override アノテーションは任意ですが、ミスの発見に役立つため推奨されます。
抽象クラスと同様に、interface を参照型として使用できます。これにより、同じ interface を Implement する異なるクラスを統一的に扱えるポリモーフィズムが可能になります。
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参照を扱うコードは、具体的なクラス型を知る必要がないからです。オブジェクトが描画可能であることだけを気にします。
次のレッスンでは、1つのクラスが複数のインターフェースを同時に Implement する方法を見ていきます。
チャレンジ
簡単クラスがインターフェースを Implement する方法を示す speaker システムを構築しましょう。任意の speaker ができることを Define するインターフェースを作成し、その後、この契約をそれぞれ独自の方法で Implement する2種類の speaker を構築します。
コードを4つのファイルに整理します。
Speaker.java:任意の speaker が実行できなければならないことを宣言する、Speakerという名前のインターフェースを Define します。すべての speaker には、String を returns するspeak()method が必要です。これは、すべての implementing classes が満たさなければならない契約です。Human.java:Speakerインターフェースを implements する class を Create します。Human にはnamefield(String)があります。name を初期化する constructor を含め、speak()method を Implement して、次を returns します:[name] says: Hello everyone!Robot.java:Speakerインターフェースを implements する別の class を Create します。Robot にはmodelfield(String)があります。model を初期化する constructor を含め、speak()method を Implement して、次を returns します:Robot [model] says: Beep boop!Main.java:インターフェースベースのポリモーフィズムを使用して、すべてをまとめます。2つの inputs、つまり human の名前と robot の model を受け取ります。Human と Robot を Create し、それらをSpeakerreferences の array に格納します。array を Loop して各 speaker に対してspeak()を呼び出した result を print します。
2つの inputs、human の名前(String)と robot の model(String)を受け取ります。
output には2行を表示します。各 speaker につき1行です。Human と Robot はまったく異なる方法で話すにもかかわらず、Speaker インターフェースを通じてどちらも同じように扱えることに注目してください。
REQUIRED OUTPUT FORMAT:
自分で試してみよう
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: 配列をループして各speakerのspeak()の結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム自分で練習してみよう: Javaオンラインコンパイラ