複数インターフェースの実装
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 36/87。
class の継承とは異なり、1 つの class しか拡張できない場合でも、Java では 複数の interfaces を implement できます。これが、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;
}
}class は、宣言するすべてのインターフェースの all methods を implement する必要があります。継承と複数の interfaces を組み合わせることもできます:
public class Square extends Shape implements Drawable, Resizable {
// 両方のインターフェースのメソッドを実装する必要がある
// Shapeから継承されたメンバーも使用できる
}この柔軟性により、複数の役割を果たす classes を設計できます。SmartPhone は Callable、Messageable、Browsable の interfaces を implement でき、それぞれがその phone がサポートする異なる機能を定義します。
チャレンジ
簡単複数の機能を持てるデバイスによるスマートデバイスシステムを構築しましょう。電源のオン/オフと音量の制御の両方ができる SmartTV を作成し、1つのクラスで複数の interface を実装して異なる役割を果たす方法を示します。
コードを4つのファイルに分けて整理します。
Powerable.java:電源を操作できるデバイス用の interface を Define します。2つの methods、powerOn()とpowerOff()を declare し、どちらも void を返すようにします。VolumeControl.java:音量を制御できるデバイス用の interface を Define します。void を返すsetVolume(int level)method と、int を返すgetVolume()method を declare します。SmartTV.java:PowerableとVolumeControlの両方の interface を implements するクラスを Create します。SmartTV にはbrandフィールド(String)、isOnフィールド(boolean、initially false)、volumeフィールド(int、initially 0)を持たせます。brand 名を受け取る constructor を含めます。必要なすべての methods を implement します。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()は current の音量を返します。
Main.java:複数の interface の implementation を実演するために、すべてを組み合わせます。2つの inputs、つまり brand 名(String)と音量レベル(int)を受け取ります。given brand で SmartTV を Create し、次の操作を行います。powerOn()を Call します。- given level を使って
setVolume()を Call します。 getVolume()を使ってCurrent volume: [volume]と Print します。powerOff()を Call します。
2つの inputs、つまり TV の brand(String)と音量レベル(int)を受け取ります。
出力には、SmartTV が両方の interface contract をどのように満たすかを示す4行を表示します。SmartTV は任意の Powerable デバイスと同じように電源を操作でき、任意の VolumeControl デバイスと同じように音量を制御できます。
自分で試してみよう
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: Print: Current volume: [volume] using getVolume()
// TODO: powerOff()を呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造6インターフェースと抽象クラス
インターフェース入門インターフェースの実装複数インターフェースの実装インターフェースのデフォルトと静的メソッド抽象クラス vs インターフェース関数型インターフェースまとめ - 決済システム自分で練習してみよう: Javaオンラインコンパイラ