Methodenüberschreibung
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 38 von 110.
Methodenüberschreibung tritt auf, wenn eine Kindklasse ihre eigene Implementierung einer Methode bereitstellt, die bereits in der Elternklasse existiert. Dadurch können Unterklassen das geerbte Verhalten anpassen und dabei dieselbe Methodensignatur beibehalten.
Wenn du in einer Kindklasse eine method mit demselben Namen und denselben Parametern wie in der parent-Klasse definierst, übernimmt die Version der Kindklasse:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic macht ein Geräusch
dog.speak(); // Buddy bellt: Wuff!
}Wenn du speak() für eine Instanz von Dog aufrufst, führt Dart die Version von Dog aus, nicht die von Animal. Die Kindklasse hat die Methode der Elternklasse überschrieben.
Du kannst das Überschreiben auch mit super kombinieren, um das Verhalten des übergeordneten Elements zu erweitern, anstatt es zu ersetzen:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Zuerst die Version der Elternklasse aufrufen
print('$name also purrs');
}
}Mit diesem Muster kannst du auf vorhandener Funktionalität aufbauen. Die wichtigste Regel ist einfach: Dieselbe Methodenbezeichnung und dieselben Parameter in der Kindklasse ersetzen die Implementierung der Elternklasse, wenn sie für Instanzen der Kindklasse aufgerufen werden.
Aufgabe
EinfachLass uns ein Benachrichtigungssystem erstellen, das zeigt, wie Kindklassen Methoden der Elternklasse überschreiben können, um das Verhalten anzupassen. Du erstellst verschiedene Benachrichtigungstypen, die Nachrichten jeweils auf ihre eigene Weise übermitteln.
Du organisierst deinen Code in zwei Dateien:
notification.dart: Definiere deine Benachrichtigungshierarchie hier:- Eine
Notification-Klasse (die Elternklasse) mit einemString titleund einemString message. Füge einen Konstruktor hinzu, der beide Werte übernimmt, sowie eine Methodesend(), dieNotification: [title] - [message]ausgibt - Eine
EmailNotification-Klasse, dieNotificationerweitert und eine EigenschaftString recipienthinzufügt. Überschreibe diesend()-Methode, sodass sieSending email to [recipient]: [title] - [message]ausgibt - Eine
PushNotification-Klasse, dieNotificationerweitert und eine EigenschaftString deviceIdhinzufügt. Überschreibe diesend()-Methode, sodass sie zuerst mitsuperdiesend()-Methode der Elternklasse aufruft und anschließend in der nächsten ZeilePushed to device: [deviceId]ausgibt
- Eine
main.dart: Importiere deine Benachrichtigungsdatei und demonstriere das Überschreiben von Methoden in Aktion:- Erstelle eine
Notificationals Basis mit dem Titel'Alert'und der Nachricht'System update available' - Rufe ihre
send()-Methode auf - Gib eine leere Zeile aus
- Erstelle eine
EmailNotificationmit dem Titel'Welcome', der Nachricht'Thanks for signing up!'und dem Empfänger'user@example.com' - Rufe ihre
send()-Methode auf - Gib eine leere Zeile aus
- Erstelle eine
PushNotificationmit dem Titel'Reminder', der Nachricht'Meeting in 10 minutes'und derdeviceId'DEVICE-001' - Rufe ihre
send()-Methode auf
- Erstelle eine
Beachte, wie EmailNotification das Verhalten der Elternklasse vollständig ersetzt, während PushNotification es erweitert, indem es zuerst super.send() aufruft. Beide Ansätze sind gültige Möglichkeiten zum Überschreiben von Methoden, je nach deinen Anforderungen.
Erwartete Ausgabe:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001Probier es selbst
import 'notification.dart';
void main() {
// TODO: Create a base Notification with title 'Alert' and message 'System update available'
// Rufe seine send()-Methode auf
// TODO: Gib eine leere Zeile aus
// TODO: Erstelle eine EmailNotification mit:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// Rufe seine send()-Methode auf
// TODO: Gib eine leere Zeile aus
// TODO: Erstelle eine PushNotification mit:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// Rufe seine send()-Methode 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