Konstruktoren und Vererbung
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 41 von 110.
Wenn eine Unterklasse eine Basisklasse erweitert, muss der Konstruktor der Basisklasse aufgerufen werden, um geerbte Felder ordnungsgemäß zu initialisieren. Dart bietet flexible Möglichkeiten, dies über die Initialisierungsliste unter Verwendung von super zu handhaben.
Wenn die Elternklasse einen parametrisierten Konstruktor hat, muss die Kindklasse diesen explizit aufrufen:
class Person {
String name;
int age;
Person(this.name, this.age);
}
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
}Dart 2.17 führte Superparameter ein, eine übersichtlichere Syntax, die Parameter direkt an den übergeordneten Konstruktor weiterleitet:
class Student extends Person {
String school;
// super.name und super.age werden direkt an den Konstruktor von Person weitergeleitet
Student(super.name, super.age, this.school);
}Wenn Sie mit benannten Konstruktoren arbeiten, geben Sie an, welcher Konstruktor der Elternklasse aufgerufen werden soll:
class Employee extends Person {
String department;
Employee(super.name, super.age, this.department);
Employee.intern(String name, this.department) : super(name, 18);
}Die wichtigste Regel ist einfach: Das übergeordnete Objekt muss vollständig initialisiert sein, bevor das untergeordnete Objekt seine eigenen Eigenschaften hinzufügt. Unabhängig davon, ob du den traditionellen Aufruf super() oder die neueren Superparameter verwendest, stellt Dart sicher, dass die Vererbungskette ordnungsgemäß vom übergeordneten zum untergeordneten Objekt aufgebaut wird.
Aufgabe
EinfachErstellen wir ein Produktinventarsystem, das demonstriert, wie Konstruktoren mit Vererbung funktionieren. Du erstellst eine Hierarchie, in der verschiedene Produkttypen eine Basisklasse für Produkte erweitern und jeder Typ eine ordnungsgemäße Initialisierung durch übergeordnete Konstruktoren erfordert.
Du organisierst deinen Code in zwei Dateien:
product.dart: Definiere hier deine Produkthierarchie:- Eine
Product-Klasse mit den EigenschaftenString nameunddouble price, einem Konstruktor, der beide Werte entgegennimmt, und einer Methodeinfo(), die[name]: $[price]ausgibt - Eine
Book-Klasse, dieProducterweitert und eineString author-Eigenschaft hinzufügt. Verwende Superparameter, umnameundpricean den übergeordneten Konstruktor weiterzuleiten - Eine
Electronics-Klasse, dieProducterweitert und eineint warranty-Eigenschaft (in Monaten) hinzufügt. Verwende den herkömmlichen Aufrufsuper()in der Initialisierungsliste, um Werte an den übergeordneten Konstruktor zu übergeben
- Eine
main.dart: Importiere deine Produktdatei und demonstriere beide Ansätze zur Konstruktorvererbung:- Erstelle ein
Bookmit dem Namen'Dart Essentials', dem Preis29.99und dem Autor'Jane Smith' - Rufe seine
info()-Methode auf und gib anschließendAuthor: [author]aus - Gib eine leere Zeile aus
- Erstelle ein
Electronicsmit dem Namen'Wireless Mouse', dem Preis45.50und der Garantie24 - Rufe seine
info()-Methode auf und gib anschließendWarranty: [warranty] monthsaus
- Erstelle ein
Beide untergeordneten Klassen erben die info()-Methode von Product, ohne sie überschreiben zu müssen. Der entscheidende Unterschied liegt darin, wie sie den übergeordneten Konstruktor aufrufen: Book verwendet die übersichtlichere Syntax mit Superparametern, während Electronics den herkömmlichen Ansatz mit super() in der Initialisierungsliste verwendet.
Erwartete Ausgabe:
Dart Essentials: $29.99
Author: Jane Smith
Wireless Mouse: $45.5
Warranty: 24 monthsProbier es selbst
import 'product.dart';
void main() {
// TODO: Erstelle ein Book mit:
// - name: 'Dart Essentials'
// - price: 29.99
// - author: 'Jane Smith'
// TODO: Rufe die Methode info() des Buchs auf
// TODO: Gib "Author: [author]" aus
// TODO: Gib eine Leerzeile aus
// TODO: Erstelle ein Electronics mit:
// - name: 'Wireless Mouse'
// - price: 45.50
// - warranty: 24
// TODO: Rufe die Methode info() der Elektronik auf
// TODO: Gib "Warranty: [warranty] months" aus
}
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