Menu
Coddy logo textTech

Interfejsy w Dart

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

W przeciwieństwie do wielu języków, które mają dedykowane słowo kluczowe interface, Dart podchodzi do tego inaczej. W Dart każda klasa automatycznie definiuje interfejs. Interfejs ten składa się ze wszystkich publicznych elementów (metod i właściwości) zadeklarowanych przez klasę.

Gdy chcesz, aby klasa zobowiązała się do zapewnienia określonej funkcjonalności bez dziedziczenia implementacji, używasz słowa kluczowego implements:

class Printer {
  void printDocument(String content) {
    print('Printing: $content');
  }
}

class Scanner {
  void scan() {
    print('Scanning document');
  }
}

// MultiFunctionDevice musi implementować WSZYSTKIE metody z obu klas
class MultiFunctionDevice implements Printer, Scanner {
  @override
  void printDocument(String content) {
    print('MFD printing: $content');
  }
  
  @override
  void scan() {
    print('MFD scanning');
  }
}

Kluczowa różnica w porównaniu z extends polega na tym, że implements nie dziedziczy żadnego kodu. Musisz samodzielnie zaimplementować każdą metodę i właściwość zdefiniowaną w interfejsie. To umowa — obiecujesz, że Twoja klasa będzie mieć te możliwości, ale sam decydujesz, jak dokładnie będą działać.

To podejście zapewnia Dart elastyczność. Możesz używać klas abstrakcyjnych, gdy chcesz zdefiniować interfejsy bez implementacji, albo używać zwykłych klas jako interfejsów, gdy ma to sens. W następnej lekcji dokładniej poznasz działanie koncepcji „niejawnego interfejsu”.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system odtwarzacza multimediów, który pokaże, jak działa słowo kluczowe implements w Dart. Utworzysz klasy pełniące rolę interfejsów, a następnie zaimplementujesz je w jednym urządzeniu łączącym wiele funkcji.

Podzielisz swój kod na dwa pliki:

  • media.dart: Zdefiniuj tutaj klasy interfejsów i klasę, która je implementuje:
    • Klasę AudioPlayer z metodą playAudio(String track), która wyświetla Playing audio: [track]
    • Klasę VideoPlayer z metodą playVideo(String title), która wyświetla Playing video: [title]
    • Klasę SmartTV, która implementuje zarówno AudioPlayer, jak i VideoPlayer. Ponieważ implements nie dziedziczy żadnego kodu, musisz samodzielnie zaimplementować obie metody. Twoja klasa SmartTV powinna wyświetlać SmartTV audio: [track] dla dźwięku i SmartTV video: [title] dla wideo
  • main.dart: Zaimportuj plik multimedialny i pokaż, jak jedna klasa może implementować wiele interfejsów:
    • Utwórz instancję klasy SmartTV
    • Wywołaj playAudio('Jazz Collection')
    • Wywołaj playVideo('Nature Documentary')

Zwróć uwagę, że SmartTV musi samodzielnie zaimplementować każdą metodę z obu interfejsów — nie dziedziczy oryginalnych implementacji z klas AudioPlayer ani VideoPlayer. To kluczowa różnica między implements a extends.

Oczekiwany wynik:

SmartTV audio: Jazz Collection
SmartTV video: Nature Documentary

Spróbuj swoich sił

import 'media.dart';

void main() {
  // TODO: Utwórz instancję SmartTV
  
  // TODO: Wywołaj playAudio('Jazz Collection')
  
  // TODO: Wywołaj playVideo('Nature Documentary')
  
}
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