Menu
Coddy logo textTech

Wiele interfejsów

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 48 z 110.

Jedną z największych zalet interfejsów w porównaniu z dziedziczeniem jest to, że klasa może implementować wiele interfejsów. Dart pozwala rozszerzać tylko jedną klasę, ale możesz implementować tyle interfejsów, ile potrzebujesz.

abstract class Printable {
  void printContent();
}

abstract class Saveable {
  void save();
}

abstract class Shareable {
  void share(String recipient);
}

class Document implements Printable, Saveable, Shareable {
  String content;
  
  Document(this.content);
  
  @override
  void printContent() {
    print('Printing: $content');
  }
  
  @override
  void save() {
    print('Saving document...');
  }
  
  @override
  void share(String recipient) {
    print('Sharing with $recipient');
  }
}

Podczas implementowania wielu interfejsów musisz zapewnić implementacje wszystkich metod z każdego interfejsu. Klasa musi spełniać wszystkie kontrakty, których obsługę deklaruje.

Możesz też łączyć extends z wieloma implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Nadal trzeba implementować wszystkie metody interfejsów
  // (w tym przypadku są już dziedziczone z Document)
}

Ta elastyczność pozwala projektować klasy, które pełnią wiele ról. SmartPhone może implementować interfejsy Camera, Phone i MusicPlayer, zapewniając, że potrafi robić wszystko, czego wymagają poszczególne interfejsy, a jednocześnie zachowując własną, unikalną implementację.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system inteligentnych urządzeń, który pokaże, jak pojedyncza klasa może implementować wiele interfejsów, łącząc różne możliwości. Utworzysz osobne klasy interfejsów dla różnych funkcji urządzenia, a następnie zbudujesz urządzenie, które potrafi to wszystko.

Podzielisz swój kod na dwa pliki:

  • devices.dart: Zdefiniuj tutaj interfejsy i implementującą je klasę:
    • Klasa Connectable z metodą connect(), która wypisuje Connecting to network...
    • Klasa Chargeable z metodą charge(), która wypisuje Charging battery...
    • Klasa Displayable z metodą showScreen(String content), która wypisuje Displaying: [content]
    • Klasa Tablet, która implementuje wszystkie trzy interfejsy: Connectable, Chargeable i Displayable. Dodaj właściwość String brand oraz konstruktor. Twoje implementacje powinny wypisywać [brand] tablet connecting to WiFi dla metody connect, [brand] tablet charging via USB-C dla metody charge oraz [brand] screen: [content] dla metody showScreen
  • main.dart: Zaimportuj plik z urządzeniami i pokaż, jak klasa Tablet spełnia wymagania wszystkich trzech interfejsów:
    • Utwórz obiekt Tablet z marką 'Galaxy'
    • Wywołaj connect()
    • Wywołaj charge()
    • Wywołaj showScreen('Welcome Home')

Klasa Tablet musi zawierać własną implementację każdej metody ze wszystkich trzech interfejsów. Pokazuje to, jak implementowanie wielu interfejsów pozwala pojedynczej klasie obiecywać wiele możliwości, zachowując jednocześnie unikatową implementację dla danego urządzenia.

Oczekiwany wynik:

Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome Home

Spróbuj swoich sił

import 'devices.dart';

void main() {
  // TODO: Utwórz obiekt Tablet marki 'Galaxy'
  
  // TODO: Wywołaj connect()
  
  // TODO: Wywołaj charge()
  
  // TODO: Wywołaj showScreen('Welcome Home')
  
}
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 Dart online