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 AnimalCette 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.
Défi
FacileConstruisons 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
Vehicleavec une propriétéString modelet une propriétéint speed. Incluez un constructeur qui prend les deux valeurs. Ajoutez une méthodeaccelerate()qui affiche[model] accelerating to [speed] km/h - Un mixin
TurboBoostrestreint àVehicleen utilisant le mot-cléon. Ce mixin doit avoir une méthodeactivateTurbo()qui affiche[model] TURBO ACTIVATED!puis appelleaccelerate()(tous deux accessibles grâce à la contrainteon Vehicle) - Une classe
SportsCarqui étendVehicleet utilise le mixinTurboBoost. Ajoutez une propriétéString color. Le constructeur doit prendre le modèle, la vitesse et la couleur. Incluez une méthodeshowOff()qui affiche[color] [model] ready to race!
- Une classe
main.dart: Importez votre fichier de véhicules et démontrez comment le mixin restreint fonctionne :- Créez une
SportsCaravec le modèle'Ferrari', la vitesse320, et la couleur'Red' - Appelez
showOff() - Appelez
activateTurbo()
- Créez une
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/hAide-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 AnimalCette 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()
}
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
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository