複数インターフェースの実装
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 36/87。
1つのクラスしか継承できないクラス継承とは異なり、Javaでは1つのクラスが複数のインターフェースを実装することを許可しています。これが、Javaが多重継承の形式を安全に実現する方法です。
複数のインターフェースを実装するには、implementsキーワードの後にカンマで区切ってそれらを記述します:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}クラスは、宣言するすべてのインターフェースのすべてのメソッドを実装する必要があります。また、継承と複数のインターフェースを組み合わせることもできます:
public class Square extends Shape implements Drawable, Resizable {
// 両方のインターフェースのメソッドを実装する必要があります
// Shapeから継承されたメンバーを使用することもできます
}この柔軟性により、複数の役割を果たすクラスを設計できます。SmartPhone は Callable、Messageable、および Browsable インターフェースを実装でき、それぞれがその電話がサポートする異なる機能を定義します。
チャレンジ
簡単デバイスが複数の機能を持つことができるスマートデバイスシステムを構築しましょう。電源のオン/オフと音量調節の両方が可能な SmartTV を作成します。これは、単一のクラスが複数のインターフェースを実装して異なる役割を果たす方法を示すデモンストレーションです。
コードを4つのファイルに分けて構成します:
Powerable.java: 電源操作が可能なデバイス用のインターフェースを定義します。powerOn()とpowerOff()の2つのメソッド(どちらも戻り値は void)を宣言する必要があります。VolumeControl.java: 音量調節が可能なデバイス用のインターフェースを定義します。void を返すsetVolume(int level)メソッドと、int を返すgetVolume()メソッドを宣言する必要があります。SmartTV.java:PowerableとVolumeControlの両方のインターフェースを実装するクラスを作成します。SmartTV は、brandフィールド(String)、isOnフィールド(boolean、初期値は false)、およびvolumeフィールド(int、初期値は 0)を持つ必要があります。ブランド名を受け取るコンストラクタを含めてください。必要なすべてのメソッドを実装します:powerOn()はisOnを true に設定し、[brand] TV is now ONと出力する必要があります。powerOff()はisOnを false に設定し、[brand] TV is now OFFと出力する必要があります。setVolume(int level)は音量を更新し、[brand] TV volume set to [level]と出力する必要があります。getVolume()は現在の音量を返す必要があります。
Main.java: すべてを組み合わせて、複数のインターフェース実装を実演します。ブランド名(String)と音量レベル(int)の2つの入力を受け取ります。指定されたブランドで SmartTV を作成し、その後:powerOn()を呼び出す- 指定されたレベルで
setVolume()を呼び出す getVolume()を使用してCurrent volume: [volume]と出力するpowerOff()を呼び出す
TVのブランド(String)と音量レベル(int)の2つの入力を受け取ります。
出力には、SmartTV が両方のインターフェースの契約をどのように満たしているかを示す4行が表示されます。つまり、他の Powerable デバイスと同様に電源を操作でき、他の VolumeControl デバイスと同様に音量を調節できることを示します!
チートシート
クラスは、implementsキーワードの後にカンマで区切ってリストすることで、複数のインターフェースを実装できます。
public class Rectangle implements Drawable, Resizable {
// 両方のインターフェースのすべてのメソッドを実装する必要があります
}クラスは、宣言したすべてのインターフェースのすべてのメソッドを実装しなければなりません。
クラスの継承と複数のインターフェースの実装を組み合わせることもできます。
public class Square extends Shape implements Drawable, Resizable {
// 両方のインターフェースのメソッドを実装します
// Shapeから継承されたメンバーを使用できます
}これにより、クラスは複数の役割を果たし、異なる機能を持つことができます。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO: 指定されたブランドで SmartTV を作成する
// TODO: powerOn() を呼び出す
// TODO: 指定されたレベルで setVolume() を呼び出す
// TODO: getVolume() を使用して「Current volume: [volume]」を出力する
// TODO: powerOff() を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム