Das Schlüsselwort „on“ in Mixins
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 53 von 110.
Manchmal muss ein Mixin Methoden oder Eigenschaften der Klasse verwenden, in die es eingebunden wird. Mit dem Schlüsselwort on kannst du ein Mixin darauf beschränken, nur mit Klassen verwendet zu werden, die einen bestimmten Typ erweitern.
class Animal {
String name;
Animal(this.name);
void breathe() => print('$name is breathing');
}
mixin Swimming on Animal {
void swim() {
print('$name is swimming'); // Kann auf 'name' von Animal zugreifen
breathe(); // Kann Methoden von Animal aufrufen
}
}
class Fish extends Animal with Swimming {
Fish(String name) : super(name);
}Die Deklaration on Animal bedeutet, dass dieses Mixin nur auf Klassen angewendet werden kann, die Animal erweitern. Dadurch wird garantiert, dass das Mixin Zugriff auf die Member von Animal hat. Ohne on wüsste das Mixin nicht, dass name oder breathe() existieren.
Wenn du versuchst, ein eingeschränktes Mixin in einer inkompatiblen Klasse zu verwenden, gibt Dart einen Kompilierungsfehler aus:
class Robot with Swimming {} // Fehler! Robot erweitert Animal nichtDiese Einschränkung ist nützlich, wenn die Funktionalität deines Mixins von bestimmten Fähigkeiten einer Basisklasse abhängt. Sie schafft einen sichereren Vertrag – das Mixin verspricht ein bestimmtes Verhalten, aber nur, wenn es über die erforderliche Grundlage verfügt, um korrekt zu funktionieren.
Aufgabe
EinfachErstelle ein Fahrzeugsystem, das veranschaulicht, wie das Schlüsselwort on Mixins darauf beschränkt, nur mit bestimmten Basisklassen zu funktionieren. Du erstellst ein Mixin, das eine Turbo-Boost-Funktionalität hinzufügt, aber es kann nur von Klassen verwendet werden, die eine Vehicle-Basisklasse erweitern.
Du organisierst deinen Code in zwei Dateien:
vehicles.dart: Definiere hier deine Basisklasse, das eingeschränkte Mixin und die Fahrzeugtypen:- Eine
Vehicle-Klasse mit einerString model-Eigenschaft und einerint speed-Eigenschaft. Füge einen Konstruktor hinzu, der beide Werte entgegennimmt. Füge eine Methodeaccelerate()hinzu, die[model] accelerating to [speed] km/hausgibt. - Ein
TurboBoost-Mixin, das mithilfe des SchlüsselwortsVehicleaufonbeschränkt ist. Dieses Mixin sollte eine MethodeactivateTurbo()besitzen, die[model] TURBO ACTIVATED!ausgibt und anschließendaccelerate()aufruft (beides ist aufgrund der Einschränkungon Vehiclezugänglich). - Eine
SportsCar-Klasse, dieVehicleerweitert und dasTurboBoost-Mixin verwendet. Füge eineString color-Eigenschaft hinzu. Der Konstruktor sollte model, speed und color entgegennehmen. Füge eine MethodeshowOff()hinzu, die[color] [model] ready to race!ausgibt.
- Eine
main.dart: Importiere deine Fahrzeugdatei und veranschauliche, wie das eingeschränkte Mixin funktioniert:- Erstelle ein
SportsCarmit dem Modell'Ferrari', der Geschwindigkeit320und der Farbe'Red'. - Rufe
showOff()auf. - Rufe
activateTurbo()auf.
- Erstelle ein
Das TurboBoost-Mixin kann auf model zugreifen und accelerate() aufrufen, weil die Deklaration on Vehicle garantiert, dass es nur in Klassen gemischt wird, die Vehicle erweitern. Dadurch entsteht ein sicherer Vertrag, bei dem das Mixin genau weiß, welche Fähigkeiten verfügbar sind.
Erwartete Ausgabe:
Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/hProbier es selbst
import 'vehicles.dart';
void main() {
// TODO: Erstelle ein SportsCar mit dem Modell 'Ferrari', der Geschwindigkeit 320 und der Farbe 'Red'
// TODO: Rufe showOff() auf
// TODO: Rufe activateTurbo() 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler