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