Menu
Coddy logo textTech

Die @override-Annotation

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

Die @override-Annotation ist eine Best-Practice-Markierung, die Dart (und anderen Entwicklern) mitteilt, dass Sie absichtlich eine Methode einer Elternklasse ersetzen. Obwohl das Überschreiben von Methoden auch ohne sie funktioniert, bietet die Verwendung von @override ein wichtiges Sicherheitsnetz.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

Die Annotation bietet zwei wesentliche Vorteile. Erstens dokumentiert sie Ihre Absicht klar – jeder, der den Code liest, weiß sofort, dass diese Methode in der Elternklasse existiert. Zweitens warnt Sie der Analyzer von Dart, wenn die Elternmethode tatsächlich nicht existiert, wodurch Tippfehler und Refactoring-Fehler frühzeitig erkannt werden.

Überlegen Sie, was passiert, wenn Sie den Methodennamen ohne @override falsch schreiben:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Tippfehler! Keine Warnung ohne @override
    print('$name meows');
  }
}

Ohne die Annotation nimmt Dart an, dass Sie eine neue Methode namens speek() erstellen. Mit @override würde der Analyzer sofort melden, dass eine solche Methode in der Elternklasse nicht existiert. Diese einfache Annotation verhindert subtile Fehler, die später schwer aufzuspüren sein können.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Mediaplayer-System bauen, das die Bedeutung der @override-Annotation bei der Anpassung von geerbtem Verhalten demonstriert. Sie werden verschiedene Medientypen erstellen, die jeweils Inhalte auf ihre eigene Weise abspielen.

Sie werden Ihren Code in zwei Dateien organisieren:

  • media.dart: Definieren Sie hier Ihre Medienhierarchie:
    • Eine Media-Klasse mit einer String title-Eigenschaft, einem Konstruktor, der den Titel entgegennimmt, und einer Methode play(), die Playing: [title] ausgibt.
    • Eine Song-Klasse, die Media erweitert und eine String artist-Eigenschaft hinzufügt. Verwenden Sie die @override-Annotation und überschreiben Sie play(), um Playing song: [title] by [artist] auszugeben.
    • Eine Video-Klasse, die Media erweitert und eine int duration-Eigenschaft (in Sekunden) hinzufügt. Verwenden Sie @override und überschreiben Sie play(), um zuerst die Version der Elternklasse mit super.play() aufzurufen und dann Duration: [duration] seconds auszugeben.
  • main.dart: Importieren Sie Ihre Mediendatei und demonstrieren Sie die überschriebenen Methoden:
    • Erstellen Sie ein Media-Objekt mit dem Titel 'Generic Content' und rufen Sie play() auf.
    • Geben Sie eine Leerzeile aus.
    • Erstellen Sie einen Song mit dem Titel 'Imagine' und dem Künstler 'John Lennon', und rufen Sie dann play() auf.
    • Geben Sie eine Leerzeile aus.
    • Erstellen Sie ein Video mit dem Titel 'Dart Tutorial' und der Dauer 360, und rufen Sie dann play() auf.

Die @override-Annotation dokumentiert Ihre Absicht und hilft dabei, Fehler zu finden. Wenn Sie play() versehentlich als plya() schreiben würden, würde die Annotation Sie darauf hinweisen, dass eine solche Methode in der Elternklasse nicht existiert.

Erwartete Ausgabe:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Spickzettel

Die @override-Annotation markiert Methoden, die absichtlich eine Methode einer Elternklasse ersetzen. Obwohl sie optional ist, bietet sie Sicherheit und Klarheit.

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  @override
  void speak() {
    print('$name barks: Woof!');
  }
}

Vorteile von @override:

  • Dokumentiert die Absicht – zeigt, dass die Methode in der Elternklasse existiert
  • Erkennt Fehler – der Dart-Analyzer warnt, wenn die Elternmethode nicht existiert, was Tippfehler verhindert

Ohne @override erzeugen Tippfehler neue Methoden, anstatt Fehler zu melden:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Tippfehler erzeugt neue Methode ohne Warnung
    print('$name meows');
  }
}

Sie können die Version der Elternklasse mit super aufrufen:

@override
void play() {
  super.play();  // Zuerst die Elternmethode aufrufen
  print('Additional behavior');
}

Probier es selbst

import 'media.dart';

void main() {
  // TODO: Erstelle ein Media-Objekt mit dem Titel 'Generic Content' und rufe play() auf
  
  
  // TODO: Drucke eine Leerzeile
  
  
  // TODO: Erstelle einen Song mit dem Titel 'Imagine' und dem Künstler 'John Lennon', rufe dann play() auf
  
  
  // TODO: Drucke eine Leerzeile
  
  
  // TODO: Erstelle ein Video mit dem Titel 'Dart Tutorial' und der Dauer 360, rufe dann play() 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