Menu
Coddy logo textTech

Implementacja wielu interfejsów

Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 36 z 87.

W przeciwieństwie do dziedziczenia klas, w którym można rozszerzyć tylko jedną klasę, Java pozwala klasie implementować wiele interfejsów. W ten sposób Java bezpiecznie realizuje pewną formę wielokrotnego dziedziczenia.

Aby zaimplementować wiele interfejsów, wymień je po słowie kluczowym implements, oddzielając je przecinkami:

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;
    }
}

Klasa musi implementować wszystkie metody z każdego interfejsu, który deklaruje. Możesz także łączyć dziedziczenie z wieloma interfejsami:

public class Square extends Shape implements Drawable, Resizable {
    // Musi implementować metody z obu interfejsów
    // Może również używać elementów odziedziczonych po Shape
}

Ta elastyczność pozwala projektować klasy pełniące wiele ról. SmartPhone może implementować interfejsy Callable, Messageable i Browsable, z których każdy definiuje inne możliwości obsługiwane przez telefon.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system inteligentnych urządzeń, w którym urządzenia mogą mieć wiele możliwości. Utworzysz SmartTV, którym można zarówno włączać i wyłączać zasilanie, jak i sterować głośnością: zademonstrujesz w ten sposób, jak jedna klasa może implementować wiele interfejsów, aby pełnić różne role.

Rozmieścisz swój kod w czterech plikach:

  • Powerable.java: Zdefiniuj interfejs dla urządzeń, które można włączać i wyłączać. Powinien deklarować dwie metody: powerOn() i powerOff(), obie zwracające void.
  • VolumeControl.java: Zdefiniuj interfejs dla urządzeń z regulacją głośności. Powinien deklarować metodę setVolume(int level), która zwraca void, oraz metodę getVolume(), która zwraca int.
  • SmartTV.java: Utwórz klasę implementującą oba interfejsy: Powerable i VolumeControl. Twój SmartTV powinien mieć pole brand (String), pole isOn (boolean, początkowo false) oraz pole volume (int, początkowo 0). Dodaj konstruktor przyjmujący nazwę marki. Zaimplementuj wszystkie wymagane metody:
    • powerOn() powinno ustawić isOn na true i wypisać: [brand] TV is now ON
    • powerOff() powinno ustawić isOn na false i wypisać: [brand] TV is now OFF
    • setVolume(int level) powinno zaktualizować głośność i wypisać: [brand] TV volume set to [level]
    • getVolume() powinno zwrócić bieżącą głośność
  • Main.java: Połącz wszystko, aby zademonstrować implementację wielu interfejsów. Otrzymasz dwa dane wejściowe: nazwę marki (String) i poziom głośności (int). Utwórz SmartTV z podaną marką, a następnie:
    • Wywołaj powerOn()
    • Wywołaj setVolume() z podanym poziomem
    • Wypisz: Current volume: [volume], używając getVolume()
    • Wywołaj powerOff()

Otrzymasz dwa dane wejściowe: markę telewizora (String) i poziom głośności (int).

Twój wynik powinien zawierać cztery wiersze demonstrujące, jak Twój SmartTV spełnia wymagania obu interfejsów. Można go włączać i wyłączać jak każde urządzenie Powerable, a także sterować jego głośnością jak w przypadku każdego urządzenia VolumeControl!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Odczytaj dane wejściowe
        String brand = scanner.nextLine();
        int volumeLevel = scanner.nextInt();
        
        // TODO: Utwórz SmartTV o podanej marce
        
        // TODO: Wywołaj powerOn()
        
        // TODO: Wywołaj setVolume() z podanym poziomem
        
        // TODO: Wypisz: Current volume: [volume], używając getVolume()
        
        // TODO: Wywołaj powerOff()
        
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online