Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen 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 Eigenschaften String name und double price, einem Konstruktor, der beide Werte entgegennimmt, und einer Methode info(), die [name]: $[price] ausgibt
    • Eine Book-Klasse, die Product erweitert und eine String author-Eigenschaft hinzufügt. Verwende Superparameter, um name und price an den übergeordneten Konstruktor weiterzuleiten
    • Eine Electronics-Klasse, die Product erweitert und eine int warranty-Eigenschaft (in Monaten) hinzufügt. Verwende den herkömmlichen Aufruf super() in der Initialisierungsliste, um Werte an den übergeordneten Konstruktor zu übergeben
  • main.dart: Importiere deine Produktdatei und demonstriere beide Ansätze zur Konstruktorvererbung:
    • Erstelle ein Book mit dem Namen 'Dart Essentials', dem Preis 29.99 und dem Autor 'Jane Smith'
    • Rufe seine info()-Methode auf und gib anschließend Author: [author] aus
    • Gib eine leere Zeile aus
    • Erstelle ein Electronics mit dem Namen 'Wireless Mouse', dem Preis 45.50 und der Garantie 24
    • Rufe seine info()-Methode auf und gib anschließend Warranty: [warranty] months aus

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 months

Probier 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
}
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