Menu
Coddy logo textTech

Utilisation de plusieurs Mixins

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 52 sur 110.

Tout comme vous pouvez implémenter plusieurs interfaces, vous pouvez également appliquer plusieurs mixins à une seule classe. Il suffit de les lister après le mot-clé with, séparés par des virgules.

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

L'ordre des mixins est important lorsqu'ils possèdent des méthodes portant le même nom. Le dernier mixin de la liste l'emporte :

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

Puisque B vient après A, sa méthode greet() a la priorité. Ce comportement de superposition vous permet de composer des classes avec exactement les capacités dont vous avez besoin, en combinant des fonctionnalités provenant de multiples sources sans hiérarchies d'héritage complexes.

challenge icon

Défi

Facile

Construisons un système d'appareils domestiques intelligents qui combine plusieurs capacités grâce aux mixins. Vous allez créer différents mixins représentant diverses fonctionnalités intelligentes, puis construire un appareil qui les utilise toutes ensemble.

Vous organiserez votre code en deux fichiers :

  • smart_features.dart : Définissez trois mixins qui fournissent différentes capacités de maison intelligente :
    • Un mixin VoiceControl avec une méthode voiceCommand(String command) qui affiche Voice: [command]
    • Un mixin WiFiEnabled avec une méthode connectWiFi(String network) qui affiche Connected to [network]
    • Un mixin PowerSaver avec une méthode enterSleepMode() qui affiche Entering sleep mode... et une méthode wakeUp() qui affiche Waking up!
    Ensuite, créez une classe SmartSpeaker qui utilise les trois mixins. Ajoutez une propriété String name avec un constructeur, et incluez une méthode playMusic(String song) qui affiche [name] playing: [song]
  • main.dart : Importez votre fichier de fonctionnalités intelligentes et démontrez comment l'enceinte combine toutes les capacités :
    • Créez un SmartSpeaker nommé 'Echo'
    • Appelez connectWiFi('HomeNetwork')
    • Appelez voiceCommand('Play jazz')
    • Appelez playMusic('Smooth Jazz Mix')
    • Appelez enterSleepMode()
    • Appelez wakeUp()

Votre SmartSpeaker acquiert des méthodes des trois mixins avec une seule clause with, démontrant comment plusieurs mixins vous permettent de composer exactement les capacités dont vous avez besoin sans héritage complexe.

Sortie attendue :

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

Aide-mémoire

Une classe peut appliquer plusieurs mixins en les listant après le mot-clé with, séparés par des virgules :

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

class Duck with Swimming, Flying {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // Provient du mixin Swimming
  duck.fly();    // Provient du mixin Flying
  duck.quack();  // Provient de la classe Duck
}

Lorsque plusieurs mixins possèdent des méthodes portant le même nom, le dernier mixin de la liste est prioritaire :

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

Essayez vous-même

import 'smart_features.dart';

void main() {
  // TODO: Créer un SmartSpeaker nommé 'Echo'
  
  // TODO: Appeler connectWiFi('HomeNetwork')
  
  // TODO: Appeler voiceCommand('Play jazz')
  
  // TODO: Appeler playMusic('Smooth Jazz Mix')
  
  // TODO: Appeler enterSleepMode()
  
  // TODO: Appeler wakeUp()
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet