Menu
Coddy logo textTech

Abstrakte Klassen

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

Eine abstrakte Klasse ist eine Klasse, die nicht direkt instanziiert werden kann. Sie dient als Entwurf für andere Klassen und definiert eine gemeinsame Struktur, der Unterklassen folgen müssen. Sie erstellen eine solche Klasse mit dem Schlüsselwort abstract.

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Fehler! Abstrakte Klasse kann nicht instanziiert werden
  var circle = Circle('blue', 5.0);
  circle.describe();  // Eine blaue Form
}

Abstrakte Klassen sind nützlich, wenn Sie ein Konzept haben, das zu allgemein ist, um für sich allein zu existieren. Eine „Shape“ ist eine Idee, aber Sie können keine Form zeichnen, ohne zu wissen, ob es sich um einen Kreis, ein Rechteck oder ein Dreieck handelt. Die abstrakte Klasse definiert, was alle Formen gemeinsam haben, während konkrete Unterklassen die spezifischen Details liefern.

Beachten Sie, dass abstrakte Klassen immer noch reguläre Methoden mit Implementierungen (wie describe()) und Konstruktoren haben können. Unterklassen erben diese genau wie bei normaler Vererbung. Der entscheidende Unterschied besteht einfach darin, dass Sie keine Instanz der abstrakten Klasse selbst erstellen können – Sie müssen eine konkrete Unterklasse verwenden.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Fahrzeugsystem bauen, das zeigt, wie abstrakte Klassen als Baupläne für spezifischere Typen dienen. Sie werden eine abstrakte Basisklasse erstellen, die definiert, was alle Fahrzeuge gemeinsam haben, und diese dann mit konkreten Fahrzeugtypen erweitern.

Sie werden Ihren Code in zwei Dateien organisieren:

  • vehicle.dart: Definieren Sie hier Ihre Fahrzeughierarchie:
    • Eine abstract class Vehicle mit einer String brand und int year Eigenschaft. Fügen Sie einen Konstruktor hinzu, der beide Werte entgegennimmt, und eine Methode displayInfo(), die [brand] ([year]) ausgibt.
    • Eine Car Klasse, die Vehicle erweitert und eine int doors Eigenschaft hinzufügt. Fügen Sie eine Methode honk() hinzu, die Beep beep! ausgibt.
    • Eine Motorcycle Klasse, die Vehicle erweitert und eine bool hasSidecar Eigenschaft hinzufügt. Fügen Sie eine Methode revEngine() hinzu, die Vroom! ausgibt.
  • main.dart: Importieren Sie Ihre Fahrzeugdatei und demonstrieren Sie, wie abstrakte Klassen funktionieren:
    • Erstellen Sie ein Car mit der Marke 'Toyota', dem Jahr 2022 und 4 Türen.
    • Rufen Sie die Methode displayInfo() auf (geerbt von Vehicle).
    • Geben Sie Doors: [doors] aus.
    • Rufen Sie die Methode honk() auf.
    • Geben Sie eine Leerzeile aus.
    • Erstellen Sie ein Motorcycle mit der Marke 'Harley', dem Jahr 2021 und hasSidecar false.
    • Rufen Sie die Methode displayInfo() auf.
    • Geben Sie Has sidecar: [hasSidecar] aus.
    • Rufen Sie die Methode revEngine() auf.

Denken Sie daran, dass Sie keine Instanz von Vehicle direkt erstellen können, da sie abstrakt ist – Sie müssen eine der konkreten Unterklassen verwenden. Sowohl Car als auch Motorcycle erben die Methode displayInfo() von der abstrakten Elternklasse.

Erwartete Ausgabe:

Toyota (2022)
Doors: 4
Beep beep!

Harley (2021)
Has sidecar: false
Vroom!

Spickzettel

Eine abstrakte Klasse ist eine Klasse, die nicht direkt instanziiert werden kann. Sie dient als Entwurf für andere Klassen und definiert eine gemeinsame Struktur, der Unterklassen folgen müssen. Erstellen Sie eine mit dem Schlüsselwort abstract:

abstract class Shape {
  String color;
  
  Shape(this.color);
  
  void describe() {
    print('A $color shape');
  }
}

class Circle extends Shape {
  double radius;
  
  Circle(String color, this.radius) : super(color);
}

void main() {
  // Shape s = Shape('red');  // Error! Cannot instantiate abstract class
  var circle = Circle('blue', 5.0);
  circle.describe();  // A blue shape
}

Abstrakte Klassen können Folgendes haben:

  • Reguläre Methoden mit Implementierungen
  • Konstruktoren
  • Eigenschaften

Unterklassen erben diese Mitglieder genau wie bei der normalen Vererbung. Der Hauptunterschied besteht darin, dass Sie keine Instanz der abstrakten Klasse selbst erstellen können – Sie müssen eine konkrete Unterklasse verwenden.

Probier es selbst

import 'vehicle.dart';

void main() {
  // TODO: Erstelle ein Auto (Car) mit der Marke 'Toyota', Jahr 2022 und 4 Türen
  
  // TODO: Rufe displayInfo() für das Auto auf
  
  // TODO: Gib "Doors: [doors]" aus
  
  // TODO: Rufe honk() für das Auto auf
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Erstelle ein Motorrad (Motorcycle) mit der Marke 'Harley', Jahr 2021 und hasSidecar false
  
  // TODO: Rufe displayInfo() für das Motorrad auf
  
  // TODO: Gib "Has sidecar: [hasSidecar]" aus
  
  // TODO: Rufe revEngine() für das Motorrad 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