Menu
Coddy logo textTech

Mot-clé on dans les Mixins

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 53 sur 110.

Parfois, un mixin doit utiliser des méthodes ou des propriétés de la classe dans laquelle il est incorporé. Le mot-clé on vous permet de limiter l’utilisation d’un mixin aux seules classes qui étendent un type spécifique.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Peut accéder à 'name' depuis Animal
    breathe();  // Peut appeler les méthodes de Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

La déclaration on Animal signifie que ce mixin ne peut être appliqué qu’aux classes qui étendent Animal. Cela garantit que le mixin a accès aux membres de Animal. Sans on, le mixin ne saurait pas que name ou breathe() existent.

Si vous essayez d’utiliser un mixin restreint sur une classe incompatible, Dart génère une erreur de compilation :

class Robot with Swimming {}  // Erreur ! Robot n'étend pas Animal

Cette contrainte est utile lorsque les fonctionnalités de votre mixin dépendent de capacités spécifiques d’une classe de base. Elle crée un contrat plus sûr : le mixin promet un certain comportement, mais uniquement lorsqu’il dispose des fondations nécessaires pour fonctionner correctement.

challenge icon

Défi

Facile

Construisons un système de véhicules qui montre comment le mot-clé on limite l'utilisation des mixins à des classes de base spécifiques. Vous allez créer un mixin qui ajoute une fonctionnalité de turbo, mais il ne pourra être utilisé que par des classes qui étendent une classe de base Vehicle.

Vous organiserez votre code en deux fichiers :

  • vehicles.dart : définissez ici votre classe de base, votre mixin restreint et vos types de véhicules :
    • Une classe Vehicle avec une propriété String model et une propriété int speed. Incluez un constructeur qui accepte les deux valeurs. Ajoutez une méthode accelerate() qui affiche [model] accelerating to [speed] km/h
    • Un mixin TurboBoost restreint à Vehicle à l'aide du mot-clé on. Ce mixin doit posséder une méthode activateTurbo() qui affiche [model] TURBO ACTIVATED!, puis appelle accelerate() (les deux sont accessibles grâce à la contrainte on Vehicle)
    • Une classe SportsCar qui étend Vehicle et utilise le mixin TurboBoost. Ajoutez une propriété String color. Le constructeur doit accepter le modèle, la vitesse et la couleur. Incluez une méthode showOff() qui affiche [color] [model] ready to race!
  • main.dart : importez votre fichier de véhicules et montrez comment fonctionne le mixin restreint :
    • Créez une instance de SportsCar avec le modèle 'Ferrari', la vitesse 320 et la couleur 'Red'
    • Appelez showOff()
    • Appelez activateTurbo()

Le mixin TurboBoost peut accéder à model et appeler accelerate(), car la déclaration on Vehicle garantit qu'il ne sera intégré qu'à des classes qui étendent Vehicle. Cela crée un contrat sûr dans lequel le mixin sait exactement quelles fonctionnalités sont disponibles.

Résultat attendu :

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

Essayez vous-même

import 'vehicles.dart';

void main() {
  // À FAIRE : Créer une SportsCar avec le modèle 'Ferrari', une vitesse de 320 et la couleur 'Red'
  
  // À FAIRE : Appeler showOff()
  
  // À FAIRE : Appeler activateTurbo()
}
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

Entraînez-vous par vous-même : Compilateur Dart en ligne