Menu
Coddy logo textTech

Das super-Schlüsselwort

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

Das Schlüsselwort super gibt einer Kindklasse direkten Zugriff auf ihre Elternklasse. Sie haben es bereits in Konstruktoren mit super(name) gesehen, aber es ist auch in anderen Kontexten nützlich.

Wenn Sie den Konstruktor der Elternklasse aufrufen müssen, übergibt super Argumente in der Vererbungskette nach oben:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

Das Schlüsselwort super ermöglicht es Ihnen außerdem, auf Methoden und Eigenschaften der Elternklasse aus der Kindklasse heraus zuzugreifen. Dies ist besonders nützlich, wenn Sie das Verhalten der Elternklasse zusammen mit Ihrem eigenen verwenden möchten:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Zuerst die Methode der Elternklasse aufrufen
    print('$name says meow!');
  }
}

Wenn Sie super.makeSound() aufrufen, rufen Sie explizit die Version der Methode der Elternklasse auf. Ohne super würde der Aufruf von makeSound() auf die Methode der aktuellen Klasse verweisen, was potenziell zu einer unendlichen Rekursion führen kann.

Betrachten Sie super als eine Anweisung, die besagt: „Verwende die Version meiner Elternklasse“ – egal, ob es sich dabei um einen Konstruktor, eine Methode oder eine Eigenschaft handelt.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Nachrichtensystem erstellen, das demonstriert, wie das Schlüsselwort super es Kindklassen ermöglicht, auf das Verhalten ihrer Elternklasse zuzugreifen und dieses zu erweitern. Sie werden eine Hierarchie erstellen, in der verschiedene Nachrichtentypen auf einer Basis-Nachrichtenklasse aufbauen.

Sie werden Ihren Code in zwei Dateien organisieren:

  • message.dart: Definieren Sie hier Ihre Nachrichtenklassen:
    • Eine Message-Klasse (die Elternklasse) mit einem String sender und String content. Fügen Sie einen Konstruktor hinzu, der beide Werte entgegennimmt, sowie eine Methode display(), die From [sender]: [content] ausgibt.
    • Eine UrgentMessage-Klasse, die Message erweitert. Sie sollte eine zusätzliche Eigenschaft String priority haben. Der Konstruktor nimmt sender, content und priority entgegen und übergibt die ersten beiden mittels super an die Elternklasse. Überschreiben Sie die Methode display(), um zuerst die Version der Elternklasse mittels super.display() aufzurufen und dann Priority: [priority] in der nächsten Zeile auszugeben.
  • main.dart: Importieren Sie Ihre Nachrichtendatei und demonstrieren Sie, wie super sowohl in Konstruktoren als auch in Methoden funktioniert:
    • Erstellen Sie eine reguläre Message von 'Alice' mit dem Inhalt 'Hello there!'
    • Rufen Sie deren Methode display() auf
    • Geben Sie eine Leerzeile zur Trennung aus
    • Erstellen Sie eine UrgentMessage von 'Bob' mit dem Inhalt 'Server is down!' und der Priorität 'HIGH'
    • Rufen Sie deren Methode display() auf

Beachten Sie, wie UrgentMessage das Schlüsselwort super auf zwei Arten verwendet: im Konstruktor, um Daten an die Elternklasse zu übergeben, und in der überschriebenen Methode, um die Ausgabe der Elternklasse einzubeziehen, bevor die eigene hinzugefügt wird.

Erwartete Ausgabe:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

Spickzettel

Das Schlüsselwort super ermöglicht den Zugriff auf eine Elternklasse aus einer Kindklasse heraus.

Verwenden Sie super() im Konstruktor einer Kindklasse, um Argumente an den Konstruktor der Elternklasse zu übergeben:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

Verwenden Sie super, um Methoden der Elternklasse aus überschriebenen Methoden heraus aufzurufen:

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

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Call parent's method first
    print('$name says meow!');
  }
}

Ohne super bezieht sich der direkte Aufruf eines Methodennamens auf die Version der aktuellen Klasse, was in überschriebenen Methoden zu einer unendlichen Rekursion führen kann.

Probier es selbst

import 'message.dart';

void main() {
  // TODO: Erstelle eine reguläre Message von 'Alice' mit dem Inhalt 'Hello there!'
  
  // TODO: Rufe die display() Methode für die Nachricht auf
  
  // TODO: Gib eine Leerzeile zur Trennung aus
  
  // TODO: Erstelle eine UrgentMessage von 'Bob' mit dem Inhalt 'Server is down!' und der Priorität 'HIGH'
  
  // TODO: Rufe die display() Methode für die dringende Nachricht 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