Menu
Coddy logo textTech

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 nicht

Diese 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.

challenge icon

Aufgabe

Einfach

Erstelle 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 einer String model-Eigenschaft und einer int speed-Eigenschaft. Füge einen Konstruktor hinzu, der beide Werte entgegennimmt. Füge eine Methode accelerate() hinzu, die [model] accelerating to [speed] km/h ausgibt.
    • Ein TurboBoost-Mixin, das mithilfe des Schlüsselworts Vehicle auf on beschränkt ist. Dieses Mixin sollte eine Methode activateTurbo() besitzen, die [model] TURBO ACTIVATED! ausgibt und anschließend accelerate() aufruft (beides ist aufgrund der Einschränkung on Vehicle zugänglich).
    • Eine SportsCar-Klasse, die Vehicle erweitert und das TurboBoost-Mixin verwendet. Füge eine String color-Eigenschaft hinzu. Der Konstruktor sollte model, speed und color entgegennehmen. Füge eine Methode showOff() hinzu, die [color] [model] ready to race! ausgibt.
  • main.dart: Importiere deine Fahrzeugdatei und veranschauliche, wie das eingeschränkte Mixin funktioniert:
    • Erstelle ein SportsCar mit dem Modell 'Ferrari', der Geschwindigkeit 320 und der Farbe 'Red'.
    • Rufe showOff() auf.
    • Rufe activateTurbo() auf.

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/h

Probier 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
}
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

Übe selbstständig: Online-Dart-Compiler