Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 VoiceControl z metodą voiceCommand(String command), która wyświetla Voice: [command]
    • Miksin WiFiEnabled z metodą connectWiFi(String network), która wyświetla Connected to [network]
    • Miksin PowerSaver z metodą enterSleepMode(), która wyświetla Entering sleep mode..., oraz metodą wakeUp(), która wyświetla Waking up!
    Następnie utwórz klasę SmartSpeaker, która korzysta ze wszystkich trzech miksinów. Dodaj właściwość String name wraz z konstruktorem, a także metodę playMusic(String song), która wyświetla [name] playing: [song]
  • main.dart: Zaimportuj plik z funkcjami inteligentnego domu i pokaż, jak głośnik łączy wszystkie możliwości:
    • Utwórz obiekt SmartSpeaker o nazwie 'Echo'
    • Wywołaj connectWiFi('HomeNetwork')
    • Wywołaj voiceCommand('Play jazz')
    • Wywołaj playMusic('Smooth Jazz Mix')
    • Wywołaj enterSleepMode()
    • Wywołaj wakeUp()

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()
}
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