Menu
Coddy logo textTech

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

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から継承されたメンバーを使用することもできます
}

この柔軟性により、複数の役割を果たすクラスを設計できます。SmartPhoneCallableMessageable、および Browsable インターフェースを実装でき、それぞれがその電話がサポートする異なる機能を定義します。

challenge icon

チャレンジ

簡単

デバイスが複数の機能を持つことができるスマートデバイスシステムを構築しましょう。電源のオン/オフと音量調節の両方が可能な SmartTV を作成します。これは、単一のクラスが複数のインターフェースを実装して異なる役割を果たす方法を示すデモンストレーションです。

コードを4つのファイルに分けて構成します:

  • Powerable.java: 電源操作が可能なデバイス用のインターフェースを定義します。powerOn()powerOff() の2つのメソッド(どちらも戻り値は void)を宣言する必要があります。
  • VolumeControl.java: 音量調節が可能なデバイス用のインターフェースを定義します。void を返す setVolume(int level) メソッドと、int を返す getVolume() メソッドを宣言する必要があります。
  • SmartTV.java: PowerableVolumeControl の両方のインターフェースを実装するクラスを作成します。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() を呼び出す
        
    }
}
quiz icon腕試し

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

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