Korzystanie z wielu domieszek
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 52 z 110.
Tak jak możesz implementować wiele interfejsów, możesz też zastosować wiele domieszek w jednej klasie. Wystarczy wymienić je po słowie kluczowym with, oddzielając je przecinkami.
mixin Swimming {
void swim() => print('Swimming');
}
mixin Flying {
void fly() => print('Flying');
}
mixin Walking {
void walk() => print('Walking');
}
class Duck with Swimming, Flying, Walking {
void quack() => print('Quack!');
}
void main() {
var duck = Duck();
duck.swim(); // Z miksinu Swimming
duck.fly(); // Z miksinu Flying
duck.walk(); // Z miksinu Walking
duck.quack(); // Z klasy Duck
}Kolejność domieszek ma znaczenie, gdy zawierają metody o tej samej nazwie. Wygrywa ostatnia domieszka na liście:
mixin A {
void greet() => print('Hello from A');
}
mixin B {
void greet() => print('Hello from B');
}
class MyClass with A, B {}
void main() {
MyClass().greet(); // Wynik: Hello from B
}Ponieważ B występuje po A, jego metoda greet() ma pierwszeństwo. To warstwowe działanie pozwala komponować klasy o dokładnie takich możliwościach, jakich potrzebujesz, łącząc funkcjonalności z wielu źródeł bez tworzenia skomplikowanych hierarchii dziedziczenia.
Wyzwanie
ŁatwyZbudujmy system urządzeń inteligentnego domu, który łączy wiele możliwości za pomocą miksinów. Utworzysz różne miksiny reprezentujące różne funkcje inteligentnego domu, a następnie zbudujesz urządzenie, które wykorzysta je wszystkie razem.
Podzielisz swój kod na dwa pliki:
smart_features.dart: Zdefiniuj trzy miksiny, które zapewniają różne możliwości inteligentnego domu:- Miksin
VoiceControlz metodąvoiceCommand(String command), która wyświetlaVoice: [command] - Miksin
WiFiEnabledz metodąconnectWiFi(String network), która wyświetlaConnected to [network] - Miksin
PowerSaverz metodąenterSleepMode(), która wyświetlaEntering sleep mode..., oraz metodąwakeUp(), która wyświetlaWaking up!
SmartSpeaker, która korzysta ze wszystkich trzech miksinów. Dodaj właściwośćString namewraz z konstruktorem, a także metodęplayMusic(String song), która wyświetla[name] playing: [song]- Miksin
main.dart: Zaimportuj plik z funkcjami inteligentnego domu i pokaż, jak głośnik łączy wszystkie możliwości:- Utwórz obiekt
SmartSpeakero nazwie'Echo' - Wywołaj
connectWiFi('HomeNetwork') - Wywołaj
voiceCommand('Play jazz') - Wywołaj
playMusic('Smooth Jazz Mix') - Wywołaj
enterSleepMode() - Wywołaj
wakeUp()
- Utwórz obiekt
Klasa SmartSpeaker zyskuje metody ze wszystkich trzech miksinów za pomocą jednej klauzuli with, co pokazuje, jak wiele miksinów pozwala łączyć dokładnie te możliwości, których potrzebujesz, bez złożonego dziedziczenia.
Oczekiwany wynik:
Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!Spróbuj swoich sił
import 'smart_features.dart';
void main() {
// TODO: Utwórz SmartSpeaker o nazwie 'Echo'
// TODO: Wywołaj connectWiFi('HomeNetwork')
// TODO: Wywołaj voiceCommand('Play jazz')
// TODO: Wywołaj playMusic('Smooth Jazz Mix')
// TODO: Wywołaj enterSleepMode()
// TODO: Wywołaj wakeUp()
}
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