Die Annotation @override
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 39 von 110.
Die Annotation @override ist ein Best-Practice-Marker, der Dart (und anderen Entwicklern) mitteilt, dass du absichtlich eine Methode aus einer übergeordneten Klasse ersetzt. 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 deine Absicht eindeutig – jeder, der den Code liest, weiß sofort, dass diese Methode in der übergeordneten Klasse vorhanden ist. Zweitens warnt dich der Analyzer von Dart, wenn die Methode der übergeordneten Klasse tatsächlich nicht existiert, und erkennt so Tippfehler und Fehler beim Refactoring frühzeitig.
Überlege, was passiert, wenn du den Methodennamen ohne @override falsch schreibst:
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Tippfehler! Keine Warnung ohne @override
print('$name meows');
}
}Ohne die Annotation geht Dart davon aus, dass du eine neue Methode namens speek() erstellst. Mit @override würde der Analyzer sofort darauf hinweisen, dass eine solche Methode in der übergeordneten Klasse nicht existiert. Diese einfache Annotation verhindert subtile Fehler, die später schwer nachzuverfolgen sein können.
Aufgabe
EinfachErstellen wir ein Mediaplayer-System, das die Bedeutung der Annotation @override beim Anpassen geerbten Verhaltens veranschaulicht. Du wirst verschiedene Medientypen erstellen, die Inhalte jeweils auf ihre eigene Weise abspielen.
Du wirst deinen Code in zwei Dateien organisieren:
media.dart: Definiere hier deine Medienhierarchie:- Eine
Media-Klasse mit einerString title-Eigenschaft, einem Konstruktor, der den Titel entgegennimmt, und einer Methodeplay(), diePlaying: [title]ausgibt - Eine
Song-Klasse, dieMediaerweitert und eineString artist-Eigenschaft hinzufügt. Verwende die Annotation@overrideund überschreibeplay(), umPlaying song: [title] by [artist]auszugeben - Eine
Video-Klasse, dieMediaerweitert und eineint duration-Eigenschaft (in Sekunden) hinzufügt. Verwende@overrideund überschreibeplay(), um zuerst die Version der übergeordneten Klasse mitsuper.play()aufzurufen und anschließendDuration: [duration] secondsauszugeben
- Eine
main.dart: Importiere deine Mediendatei und demonstriere die überschriebenen Methoden:- Erstelle ein
Media-Objekt mit dem Titel'Generic Content'und rufeplay()auf - Gib eine leere Zeile aus
- Erstelle einen
Songmit dem Titel'Imagine'und dem Interpreten'John Lennon'und rufe anschließendplay()auf - Gib eine leere Zeile aus
- Erstelle ein
Videomit dem Titel'Dart Tutorial'und der Dauer360und rufe anschließendplay()auf
- Erstelle ein
Die Annotation @override dokumentiert deine Absicht und hilft dabei, Fehler zu erkennen. Falls du play() versehentlich als plya() falsch schreibst, würde dich die Annotation darauf hinweisen, dass eine solche Methode in der übergeordneten Klasse nicht existiert.
Erwartete Ausgabe:
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 secondsProbier es selbst
import 'media.dart';
void main() {
// TODO: Create a Media object with title 'Generic Content' and call play()
// TODO: Eine leere Zeile ausgeben
// TODO: Erstelle einen Song mit dem Titel 'Imagine' und dem Künstler 'John Lennon', dann rufe play() auf
// TODO: Eine leere Zeile ausgeben
// TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
}
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