Menu
Coddy logo textTech

Implementowanie interfejsów

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

Aby użyć interfejsu, klasa musi go implementować za pomocą słowa kluczowego implements. Klasa zapewnia następnie konkretne implementacje wszystkich metod zadeklarowanych w interfejsie:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

Jeśli klasa implementuje interfejs, ale nie dostarcza implementacji wszystkich jego metod, kompilator zgłosi błąd. Adnotacja @Override jest opcjonalna, ale zalecana, ponieważ pomaga wykrywać pomyłki.

Podobnie jak w przypadku klas abstrakcyjnych, możesz używać interfejsu jako typu referencyjnego. Umożliwia to polimorfizm, w którym różne klasy implementujące ten sam interfejs mogą być traktowane jednakowo:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // Rysowanie koła o promieniu 5.0
shape2.draw();  // Rysowanie prostokąta o wymiarach 4.0 x 3.0

To potężne rozwiązanie, ponieważ kod działający z referencjami Drawable nie musi znać konkretnego typu klasy. Interesuje go tylko to, czy obiekt można narysować.

W następnej lekcji zobaczysz, jak pojedyncza klasa może jednocześnie implementować wiele interfejsów.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system głośników, który pokaże, jak klasy implementują interfejsy. Utworzysz interfejs definiujący, co może robić każdy głośnik, a następnie utworzysz dwa różne typy głośników, z których każdy będzie implementować ten kontrakt na swój sposób.

Rozmieścisz swój kod w czterech plikach:

  • Speaker.java: Zdefiniuj interfejs o nazwie Speaker, który deklaruje, co musi potrafić każdy głośnik. Każdy głośnik powinien mieć metodę speak(), która zwraca String. To kontrakt, który muszą spełniać wszystkie implementujące go klasy.
  • Human.java: Utwórz klasę implementującą interfejs Speaker. Obiekt Human ma pole name (String). Dodaj konstruktor, który inicjalizuje nazwę, i zaimplementuj metodę speak(), aby zwracała: [name] says: Hello everyone!
  • Robot.java: Utwórz kolejną klasę implementującą interfejs Speaker. Obiekt Robot ma pole model (String). Dodaj konstruktor, który inicjalizuje model, i zaimplementuj metodę speak(), aby zwracała: Robot [model] says: Beep boop!
  • Main.java: Połącz wszystkie elementy, wykorzystując polimorfizm oparty na interfejsie. Otrzymasz dwa dane wejściowe: imię człowieka i model robota. Utwórz obiekt Human i obiekt Robot, a następnie umieść je w tablicy referencji typu Speaker. Przejdź przez tablicę i wypisz wynik wywołania speak() dla każdego głośnika.

Otrzymasz dwa dane wejściowe: imię człowieka (String) i model robota (String).

Wynik powinien zawierać dwa wiersze: po jednym dla każdego głośnika. Zwróć uwagę, że zarówno Human, jak i Robot mogą być traktowane jednolicie za pośrednictwem interfejsu Speaker, mimo że mówią na zupełnie różne sposoby!

Spróbuj swoich sił

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Wczytaj dane wejściowe
        String humanName = scanner.nextLine();
        String robotModel = scanner.nextLine();
        
        // TODO: Utwórz obiekt Human o podanym imieniu
        
        // TODO: Utwórz obiekt Robot o podanym modelu
        
        // TODO: Utwórz tablicę referencji typu Speaker zawierającą oba obiekty
        
        // TODO: Przejdź przez tablicę i wypisz wynik speak() dla każdego obiektu Speaker
    }
}
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