Menu
Coddy logo textTech

複数インターフェースの実装

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 を設計できます。SmartPhoneCallableMessageableBrowsable の interfaces を implement でき、それぞれがその phone がサポートする異なる機能を定義します。

challenge icon

チャレンジ

簡単

複数の機能を持てるデバイスによるスマートデバイスシステムを構築しましょう。電源のオン/オフと音量の制御の両方ができる 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.javaPowerableVolumeControl の両方の 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()を呼び出す
        
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Javaオンラインコンパイラ