Menu
Coddy logo textTech

Création de Mixins

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

Maintenant que vous comprenez ce que sont les mixins, voyons comment les créer correctement. Un mixin est déclaré en utilisant le mot-clé mixin au lieu de class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

Les mixins peuvent contenir des méthodes, des propriétés et même des getters et setters - tout comme les classes. Cependant, il existe une règle importante : les mixins ne peuvent pas avoir de constructeurs. Comme les mixins sont destinés à être « mélangés » plutôt qu'instanciés directement, ils n'ont pas besoin de logique d'initialisation.

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Utilise la méthode du mixin
  print(doc.createdAt);  // Utilise la propriété du mixin
}

Lorsque vous appliquez un mixin avec with, tous ses membres font désormais partie de votre classe. La classe peut les utiliser directement, tout comme n'importe quel code possédant une instance de cette classe. Cela fait des mixins un moyen propre d'ajouter des fonctionnalités réutilisables sans la complexité des hiérarchies d'héritage.

challenge icon

Défi

Facile

Construisons un système de messagerie qui montre comment créer des mixins avec des méthodes, des propriétés et des getters. Vous allez concevoir un mixin qui ajoute des capacités de formatage à différents types de messages.

Vous organiserez votre code en deux fichiers :

  • messaging.dart : Définissez votre mixin et vos classes de messages ici :
    • Un mixin Formattable qui contient :
      • Une propriété String prefix initialisée à '>>>'
      • Un getter separator qui retourne ' | '
      • Une méthode format(String text) qui retourne la chaîne [prefix][separator][text]
      • Une méthode formatBold(String text) qui retourne **[text]**
    • Une classe TextMessage qui utilise le mixin Formattable. Ajoutez une propriété String sender avec un constructeur. Incluez une méthode send(String content) qui affiche le résultat de l'appel à format() avec [sender]: [content]
    • Une classe AlertMessage qui utilise également le mixin Formattable. Ajoutez une propriété String level avec un constructeur. Incluez une méthode alert(String content) qui affiche le résultat de l'appel à format() avec [[level]] [formatBold(content)]
  • main.dart : Importez votre fichier de messagerie et démontrez comment les deux types de messages acquièrent des capacités de formatage grâce au mixin :
    • Créez un TextMessage avec l'expéditeur 'Alice'
    • Créez un AlertMessage avec le niveau 'WARNING'
    • Appelez send('Hello there!') sur le message texte
    • Appelez alert('System overload') sur le message d'alerte

Votre mixin démontre que les mixins peuvent contenir des propriétés avec des valeurs par défaut, des getters qui calculent des valeurs, et plusieurs méthodes qui peuvent même s'appeler entre elles. Les deux classes de messages acquièrent toute cette fonctionnalité simplement en utilisant le mot-clé with.

Sortie attendue :

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

Aide-mémoire

Les mixins sont déclarés à l'aide du mot-clé mixin au lieu de class :

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

Les mixins peuvent contenir des méthodes, des propriétés, des getters et des setters, mais ne peuvent pas avoir de constructeurs :

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

Appliquez des mixins aux classes en utilisant le mot-clé with. Tous les membres du mixin font désormais partie de la classe :

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Utilise la méthode du mixin
  print(doc.createdAt);  // Utilise la propriété du mixin
}

Essayez vous-même

import 'messaging.dart';

void main() {
  // TODO: Créer un TextMessage avec l'expéditeur 'Alice'
  
  // TODO: Créer un AlertMessage avec le niveau 'WARNING'
  
  // TODO: Appeler send('Hello there!') sur le message texte
  
  // TODO: Appeler alert('System overload') sur le message d'alerte
}
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