インターフェース入門
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 34/87。
抽象クラスが、サブクラスが従わなければならない規約(contract)をどのように定義するかを見てきました。しかし、1つのクラスに複数の規約に従わせたい場合はどうすればよいでしょうか?Javaではクラスが複数のクラスを継承(extend)することは許可されていませんが、この問題はインターフェース(interfaces)によって解決されます。
インターフェースは、クラスが何ができるかを定義する契約であり、それをどのように行うかは指定しません。抽象クラスとは異なり、インターフェースには(デフォルトで)実装のないメソッドのシグネチャのみが含まれます。
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}インターフェースを「約束」と考えてみてください。クラスがインターフェースを実装するとき、そのインターフェースで宣言されたすべてのメソッドの実装を提供することを約束します。インターフェースは機能(capability)を定義し、クラスは振る舞い(behavior)を提供します。
インターフェースは、class の代わりに interface キーワードを使用して宣言されます。インターフェース内のすべてのメソッドは暗黙的に public かつ abstract であるため、これらのキーワードを記述する必要はありません。
public interface Playable {
void play(); // 暗黙的に public abstract
void pause();
void stop();
}インターフェースは定数を宣言することもでき、それらは暗黙的に public static final となります:
public interface GameConstants {
int MAX_PLAYERS = 4; // 暗黙的に public static final です
}次のレッスンでは、implementsキーワードを使用してクラスがインターフェースを実装する方法を学びます。
チャレンジ
簡単さまざまなデバイスができることを記述するインターフェースを定義して、デバイス制御システムを構築しましょう。このチャレンジでは、インターフェース、つまり動作方法を指定せずに機能を定義する規約(コントラクト)を作成することに焦点を当てます。
コードを3つのファイルに分けて構成します:
Switchable.java: デバイスが切り替え可能(switchable)であることを定義するインターフェースを作成します。切り替え可能なデバイスは、オンとオフを切り替えることができる必要があります。turnOn()とturnOff()の2つのメソッドを宣言してください。インターフェースのメソッドは暗黙的に public かつ abstract であるため、メソッドのシグネチャのみが必要です。Adjustable.java: デバイスが調整可能(adjustable)であることを定義する別のインターフェースを作成します。調整可能なデバイスは、レベルを設定できる必要があります。setLevel(int level)メソッドを宣言してください。また、値が100の定数MAX_LEVELも含めてください。インターフェース内の定数は暗黙的にpublic static finalになることを忘れないでください。Main.java: インターフェースに関する情報を出力することで、インターフェースが正しく定義されていることを示します。1つの入力としてレベル値(int)を受け取ります。次の3行を出力してください:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](Adjustable インターフェースから定数にアクセスしてください)
Setting level to: [input level]と出力します。
1つの入力として、レベル値(int)を受け取ります。
このチャレンジは、機能を記述する設計図であるインターフェースの定義のみに焦点を当てています。次のレッスンでは、クラスが実際にこれらのインターフェースを実装して、実際の動作を提供する方法を学びます!
チートシート
インターフェースは、クラスが何ができるかを定義する契約であり、それをどのように行うかは指定しません。インターフェースには、実装のないメソッドのシグネチャのみが含まれます。
インターフェースは interface キーワードを使用して宣言されます:
public interface Drawable {
void draw();
}インターフェース内のすべてのメソッドは、暗黙的に public かつ abstract です:
public interface Playable {
void play(); // 暗黙的に public abstract
void pause();
void stop();
}インターフェースは定数を宣言でき、それらは暗黙的に public static final となります:
public interface GameConstants {
int MAX_PLAYERS = 4; // 暗黙的に public static final
}クラスは、複数のクラスを継承する場合とは異なり、複数のインターフェースを実装することができます。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: インターフェースに関する情報を出力する
// 出力: "Switchable methods: turnOn, turnOff"
// 出力: "Adjustable methods: setLevel"
// 出力: "Max level constant: " に続けて Adjustable.MAX_LEVEL
// 出力: "Setting level to: " に続けて入力されたレベル
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム