Menu
Coddy logo textTech

Usare più Mixin

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 52 di 110.

Proprio come puoi implementare più interfacce, puoi anche applicare più mixin a una singola classe. Elencali semplicemente dopo la parola chiave with, separati da virgole.

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();   // Dal mixin Swimming
  duck.fly();    // Dal mixin Flying
  duck.walk();   // Dal mixin Walking
  duck.quack();  // Dalla classe Duck
}

L'ordine dei mixin è importante quando hanno metodi con lo stesso nome. Vince l'ultimo mixin nell'elenco:

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();  // Output: Hello from B
}

Poiché B viene dopo A, il suo metodo greet() ha la precedenza. Questo comportamento a livelli ti permette di comporre classi con esattamente le funzionalità di cui hai bisogno, combinando funzionalità provenienti da più fonti senza gerarchie di ereditarietà complesse.

challenge icon

Sfida

Facile

Costruiamo un sistema di dispositivi per la casa intelligente che combina più funzionalità tramite i mixin. Creerai diversi mixin che rappresentano varie funzionalità intelligenti, poi realizzerai un dispositivo che li utilizza tutti insieme.

Organizzerai il codice in due file:

  • smart_features.dart: definisci tre mixin che forniscono diverse funzionalità per la casa intelligente:
    • Un mixin VoiceControl con un metodo voiceCommand(String command) che stampa Voice: [command]
    • Un mixin WiFiEnabled con un metodo connectWiFi(String network) che stampa Connected to [network]
    • Un mixin PowerSaver con un metodo enterSleepMode() che stampa Entering sleep mode... e un metodo wakeUp() che stampa Waking up!
    Poi crea una classe SmartSpeaker che utilizza tutti e tre i mixin. Aggiungi una proprietà String name con un costruttore e includi un metodo playMusic(String song) che stampa [name] playing: [song]
  • main.dart: importa il file delle funzionalità intelligenti e mostra come l'altoparlante combina tutte le funzionalità:
    • Crea uno SmartSpeaker chiamato 'Echo'
    • Chiama connectWiFi('HomeNetwork')
    • Chiama voiceCommand('Play jazz')
    • Chiama playMusic('Smooth Jazz Mix')
    • Chiama enterSleepMode()
    • Chiama wakeUp()

Il tuo SmartSpeaker acquisisce metodi da tutti e tre i mixin con un'unica clausola with, dimostrando come più mixin ti permettano di comporre esattamente le funzionalità di cui hai bisogno senza ricorrere a un'ereditarietà complessa.

Output previsto:

Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!

Provalo tu

import 'smart_features.dart';

void main() {
  // TODO: Crea uno SmartSpeaker chiamato 'Echo'
  
  // TODO: Chiama connectWiFi('HomeNetwork')
  
  // TODO: Chiama voiceCommand('Play jazz')
  
  // TODO: Chiama playMusic('Smooth Jazz Mix')
  
  // TODO: Chiama enterSleepMode()
  
  // TODO: Chiama wakeUp()
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online