Menu
Coddy logo textTech

Mixins erstellen

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 51 von 110.

Nachdem Sie nun verstehen, was Mixins sind, schauen wir uns an, wie man sie richtig erstellt. Ein Mixin wird mit dem mixin-Schlüsselwort anstelle von class deklariert.

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

Mixins können Methoden, Eigenschaften und sogar Getter und Setter enthalten – genau wie Klassen. Es gibt jedoch eine wichtige Regel: Mixins können keine Konstruktoren haben. Da Mixins dazu gedacht sind, „eingemischt“ zu werden, anstatt direkt instanziiert zu werden, benötigen sie keine Initialisierungslogik.

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();  // Verwendet die Methode des Mixins
  print(doc.createdAt);  // Verwendet die Eigenschaft des Mixins
}

Wenn Sie ein Mixin mit with anwenden, werden alle seine Member Teil Ihrer Klasse. Die Klasse kann sie direkt verwenden, ebenso wie jeder Code, der über eine Instanz dieser Klasse verfügt. Dies macht Mixins zu einer sauberen Möglichkeit, wiederverwendbare Funktionalität hinzuzufügen, ohne die Komplexität von Vererbungshierarchien.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Nachrichtensystem erstellen, das zeigt, wie man Mixins mit Methoden, Eigenschaften und Gettern erstellt. Sie werden ein Mixin entwerfen, das verschiedenen Arten von Nachrichten Formatierungsfunktionen hinzufügt.

Sie werden Ihren Code in zwei Dateien organisieren:

  • messaging.dart: Definieren Sie hier Ihr Mixin und Ihre Nachrichtenklassen:
    • Ein Formattable Mixin, das Folgendes enthält:
      • Eine String prefix Eigenschaft, initialisiert mit '>>>'
      • Einen Getter separator, der ' | ' zurückgibt
      • Eine Methode format(String text), die den String [prefix][separator][text] zurückgibt
      • Eine Methode formatBold(String text), die **[text]** zurückgibt
    • Eine TextMessage Klasse, die das Formattable Mixin verwendet. Fügen Sie eine String sender Eigenschaft mit einem Konstruktor hinzu. Fügen Sie eine Methode send(String content) hinzu, die das Ergebnis des Aufrufs von format() mit [sender]: [content] ausgibt
    • Eine AlertMessage Klasse, die ebenfalls das Formattable Mixin verwendet. Fügen Sie eine String level Eigenschaft mit einem Konstruktor hinzu. Fügen Sie eine Methode alert(String content) hinzu, die das Ergebnis des Aufrufs von format() mit [[level]] [formatBold(content)] ausgibt
  • main.dart: Importieren Sie Ihre Messaging-Datei und demonstrieren Sie, wie beide Nachrichtentypen Formatierungsfunktionen durch das Mixin erhalten:
    • Erstellen Sie eine TextMessage mit dem Absender 'Alice'
    • Erstellen Sie eine AlertMessage mit dem Level 'WARNING'
    • Rufen Sie send('Hello there!') für die Textnachricht auf
    • Rufen Sie alert('System overload') für die Alarmnachricht auf

Ihr Mixin zeigt, dass Mixins Eigenschaften mit Standardwerten, Getter, die Werte berechnen, und mehrere Methoden, die sich sogar gegenseitig aufrufen können, enthalten können. Beide Nachrichtenklassen erhalten all diese Funktionalität einfach durch die Verwendung des Schlüsselworts with.

Erwartete Ausgabe:

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

Spickzettel

Mixins werden mit dem Schlüsselwort mixin anstelle von class deklariert:

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

Mixins können Methoden, Eigenschaften, Getter und Setter enthalten, aber sie können keine Konstruktoren haben:

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

Wenden Sie Mixins mit dem Schlüsselwort with auf Klassen an. Alle Mixin-Elemente werden Teil der Klasse:

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

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // Verwendet die Methode des Mixins
  print(doc.createdAt);  // Verwendet die Eigenschaft des Mixins
}

Probier es selbst

import 'messaging.dart';

void main() {
  // TODO: Erstelle eine TextMessage mit dem Absender 'Alice'
  
  // TODO: Erstelle eine AlertMessage mit der Stufe 'WARNING'
  
  // TODO: Rufe send('Hello there!') für die Textnachricht auf
  
  // TODO: Rufe alert('System overload') für die Alarmnachricht auf
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung