Menu
Coddy logo textTech

Covariant-Schlüsselwort

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

Wenn Sie eine Methode in einer Unterklasse überschreiben, erfordert Dart normalerweise, dass die Parametertypen exakt übereinstimmen. Aber manchmal möchten Sie, dass eine Methode einer Unterklasse einen spezifischeren Typ akzeptiert als die Elternklasse. Das Schlüsselwort covariant ermöglicht dies.

Stellen Sie sich ein Szenario vor, in dem eine Animal-Klasse eine Methode hat, die ein anderes Animal akzeptiert:

class Animal {
  void chase(Animal other) {
    print('Chasing an animal');
  }
}

class Dog extends Animal {
  @override
  void chase(covariant Dog other) {
    print('Dog chasing another dog');
  }
}

Ohne covariant würde Dart beanstanden, dass Dog nicht derselbe Typ wie Animal ist. Durch das Hinzufügen von covariant vor dem Parameter teilen Sie Dart mit: „Ich weiß, dass dies spezifischer ist, und ich werde sicherstellen, dass nur der richtige Typ übergeben wird.“

Dies ist nützlich, wenn Unterklassen logischerweise nur mit ihrer eigenen Art arbeiten sollten:

void main() {
  Dog dog1 = Dog();
  Dog dog2 = Dog();
  
  dog1.chase(dog2);  // Funktioniert: Hund jagt einen anderen Hund
}

Aber Vorsicht – die Verwendung von covariant verschiebt die Typsicherheit zur Laufzeit. Wenn Sie die Methode über eine Referenz der Elternklasse mit dem falschen Typ aufrufen, erhalten Sie einen Laufzeitfehler anstelle eines Fehlers zur Kompilierzeit. Verwenden Sie es nur, wenn Sie sich bei den übergebenen Typen sicher sind.

challenge icon

Aufgabe

Einfach

Lass uns ein Haustier-Kompatibilitätssystem erstellen, das das Schlüsselwort covariant verwendet, um sicherzustellen, dass Haustiere nur mit ihrer eigenen Art spielen können. Du erstellst eine Hierarchie von Haustieren, in der jeder Typ über eine playWith-Methode verfügt, die nur ein Haustier desselben Typs akzeptiert.

Du organisierst deinen Code in zwei Dateien:

  • pets.dart: Definiere hier deine Haustierhierarchie:
    • Eine Pet-Klasse mit einer String name-Eigenschaft und einem Konstruktor. Füge eine Methode playWith(Pet other) hinzu, die [name] plays with [other.name] ausgibt
    • Eine Cat-Klasse, die Pet erweitert und playWith überschreibt, wobei sie das Schlüsselwort covariant verwendet, um nur eine Cat zu akzeptieren. Sie sollte [name] and [other.name] chase yarn together ausgeben
    • Eine Dog-Klasse, die Pet erweitert und playWith überschreibt, wobei sie das Schlüsselwort covariant verwendet, um nur einen Dog zu akzeptieren. Sie sollte [name] and [other.name] fetch the ball together ausgeben
    • Eine Rabbit-Klasse, die Pet erweitert und playWith überschreibt, wobei sie das Schlüsselwort covariant verwendet, um nur ein Rabbit zu akzeptieren. Sie sollte [name] and [other.name] hop around together ausgeben
  • main.dart: Importiere deine Haustierdatei und zeige, wie jeder Haustiertyp ausschließlich mit seiner eigenen Art spielt:
    • Erstelle zwei Cat-Objekte mit den Namen 'Whiskers' und 'Mittens' und lasse anschließend Whiskers mit Mittens spielen
    • Erstelle zwei Dog-Objekte mit den Namen 'Buddy' und 'Max' und lasse anschließend Buddy mit Max spielen
    • Erstelle zwei Rabbit-Objekte mit den Namen 'Flopsy' und 'Cotton' und lasse anschließend Flopsy mit Cotton spielen

Das Schlüsselwort covariant ermöglicht es jeder Unterklasse, den Parametertyp von Pet auf ihren spezifischen Typ zu beschränken, wodurch typsichere Interaktionen zwischen Haustieren derselben Art gewährleistet werden.

Erwartete Ausgabe:

Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around together

Probier es selbst

import 'pets.dart';

void main() {
  // TODO: Erstelle zwei Cat-Objekte namens 'Whiskers' und 'Mittens'
  // Dann lass Whiskers mit Mittens spielen
  
  
  // TODO: Erstelle zwei Dog-Objekte namens 'Buddy' und 'Max'
  // Dann lass Buddy mit Max spielen
  
  
  // TODO: Erstelle zwei Rabbit-Objekte namens 'Flopsy' und 'Cotton'
  // Dann lass Flopsy mit Cotton spielen
  
}
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