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.
Aufgabe
EinfachLassen 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
FormattableMixin, das Folgendes enthält:- Eine
String prefixEigenschaft, 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
- Eine
TextMessageKlasse, die dasFormattableMixin verwendet. Fügen Sie eineString senderEigenschaft mit einem Konstruktor hinzu. Fügen Sie eine Methodesend(String content)hinzu, die das Ergebnis des Aufrufs vonformat()mit[sender]: [content]ausgibt - Eine
AlertMessageKlasse, die ebenfalls dasFormattableMixin verwendet. Fügen Sie eineString levelEigenschaft mit einem Konstruktor hinzu. Fügen Sie eine Methodealert(String content)hinzu, die das Ergebnis des Aufrufs vonformat()mit[[level]] [formatBold(content)]ausgibt
- Ein
main.dart: Importieren Sie Ihre Messaging-Datei und demonstrieren Sie, wie beide Nachrichtentypen Formatierungsfunktionen durch das Mixin erhalten:- Erstellen Sie eine
TextMessagemit dem Absender'Alice' - Erstellen Sie eine
AlertMessagemit dem Level'WARNING' - Rufen Sie
send('Hello there!')für die Textnachricht auf - Rufen Sie
alert('System overload')für die Alarmnachricht auf
- Erstellen Sie eine
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
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor