Menu
Coddy logo textTech

Le 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 a besoin d'utiliser des méthodes ou des propriétés de la classe dans laquelle il est inclus. Le mot-clé on vous permet de restreindre un mixin pour qu'il ne soit utilisé qu'avec des 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 la fonctionnalité de votre mixin dépend 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 seulement lorsqu'il dispose de la base dont il a besoin pour fonctionner correctement.

challenge icon

Défi

Facile

Construisons un système de véhicules qui démontre comment le mot-clé on restreint les mixins pour qu'ils ne fonctionnent qu'avec des classes de base spécifiques. Vous allez créer un mixin qui ajoute une fonctionnalité de boost 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 votre classe de base, votre mixin restreint et vos types de véhicules ici :
    • Une classe Vehicle avec une propriété String model et une propriété int speed. Incluez un constructeur qui prend les deux valeurs. Ajoutez une méthode accelerate() qui affiche [model] accelerating to [speed] km/h
    • Un mixin TurboBoost restreint à Vehicle en utilisant le mot-clé on. Ce mixin doit avoir une méthode activateTurbo() qui affiche [model] TURBO ACTIVATED! puis appelle accelerate() (tous deux 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 prendre 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 démontrez comment le mixin restreint fonctionne :
    • Créez une 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 mélangé qu'à des classes qui étendent Vehicle. Cela crée un contrat sûr où le mixin sait exactement quelles capacités sont disponibles.

Sortie attendue :

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

Aide-mémoire

Le mot-clé on restreint l'utilisation d'un mixin aux seules classes qui étendent un type spécifique. Cela permet au mixin d'accéder en toute sécurité aux méthodes et propriétés de la classe de base.

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

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Can access 'name' from Animal
    breathe();  // Can call Animal's methods
  }
}

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

La déclaration on Animal garantit que le mixin a accès aux membres de Animal. Sans cela, le mixin ne saurait pas que name ou breathe() existent.

Tenter d'utiliser un mixin restreint sur une classe incompatible entraîne une erreur de compilation :

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

Cette contrainte est utile lorsque la fonctionnalité de votre mixin dépend de capacités spécifiques d'une classe de base, créant ainsi un contrat plus sûr entre le mixin et les classes qui l'utilisent.

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