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ę.
Wyzwanie
ŁatwyZbudujmy 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
Connectablez metodąconnect(), która wypisujeConnecting to network... - Klasa
Chargeablez metodącharge(), która wypisujeCharging battery... - Klasa
Displayablez metodąshowScreen(String content), która wypisujeDisplaying: [content] - Klasa
Tablet, która implementuje wszystkie trzy interfejsy:Connectable,ChargeableiDisplayable. Dodaj właściwośćString brandoraz konstruktor. Twoje implementacje powinny wypisywać[brand] tablet connecting to WiFidla metody connect,[brand] tablet charging via USB-Cdla metody charge oraz[brand] screen: [content]dla metody showScreen
- Klasa
main.dart: Zaimportuj plik z urządzeniami i pokaż, jak klasa Tablet spełnia wymagania wszystkich trzech interfejsów:- Utwórz obiekt
Tabletz marką'Galaxy' - Wywołaj
connect() - Wywołaj
charge() - Wywołaj
showScreen('Welcome Home')
- Utwórz obiekt
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 HomeSpró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')
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online