Menu
Coddy logo textTech

Abstrakte Methoden

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

Eine abstrakte Methode ist eine Methode, die innerhalb einer abstrakten Klasse deklariert wird und keinen Rumpf hat. Sie definiert die Methodensignatur, überlässt die Implementierung jedoch jeder Unterklasse. Jede Klasse, die die abstrakte Klasse erweitert, muss alle abstrakten Methoden überschreiben, andernfalls ist sie ebenfalls abstrakt.

abstract class Animal {
  // Abstrakte Methode - kein Rumpf, muss von Unterklassen implementiert werden
  String makeSound();

  // Konkrete Methode - hat einen Rumpf, wird von allen Unterklassen geteilt
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';  // Muss Implementierung bereitstellen
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';  // Unterschiedliche Implementierung, gleiche Signatur
  }
}

Wenn eine Unterklasse vergisst, eine abstrakte Methode zu implementieren, gibt Dart einen Kompilierfehler aus. Das ist der entscheidende Punkt – abstrakte Methoden erzwingen einen Vertrag. Jede Unterklasse hat diese Methode garantiert, sodass Sie sie sicher auf jeder Instanz des abstrakten Typs aufrufen können.

// Du kannst den abstrakten Typ als Variablentyp verwenden
Animal a = Dog();
print(a.makeSound());  // Wuff!

Animal b = Cat();
print(b.makeSound());  // Miau!

Abstrakte Methoden unterscheiden sich von konkreten Methoden in einer abstrakten Klasse. Konkrete Methoden haben einen Rumpf und werden unverändert vererbt. Abstrakte Methoden haben keinen Rumpf und müssen überschrieben werden.

Sie können beides in derselben abstrakten Klasse mischen, um ein bestimmtes Verhalten zu teilen, während Sie Unterklassen zwingen, ihr eigenes Verhalten für andere zu definieren.

MerkmalAbstrakte MethodeKonkrete Methode
Hat einen RumpfNeinJa
Muss überschrieben werdenJaNein
ZweckVertrag erzwingenVerhalten teilen
WoNur in abstrakten KlassenIn jeder Klasse
challenge icon

Aufgabe

Einfach

Lassen Sie uns einen Formenkalkulator erstellen, der abstrakte Methoden in Aktion demonstriert. Sie werden eine abstrakte Klasse mit abstrakten Methoden definieren, die jede Form unterschiedlich implementieren muss, und diese Formen dann über eine gemeinsame Schnittstelle verwenden.

Sie werden Ihren Code in vier Dateien organisieren:

  • shape.dart: Definieren Sie eine abstrakte Klasse Shape mit einem final Feld color (String) und einem Konstruktor, der dieses initialisiert. Deklarieren Sie zwei abstrakte Methoden: double area() und double perimeter(). Fügen Sie außerdem eine konkrete Methode describe() hinzu, die A [color] shape with area: [area] and perimeter: [perimeter] ausgibt. Da area() und perimeter() abstrakt sind, wird jede Unterklasse ihre eigene Berechnung bereitstellen, aber describe() funktioniert für alle, ohne überschrieben zu werden.
  • circle.dart: Erstellen Sie eine Klasse Circle, die Shape erweitert. Sie hat ein final Feld radius (double). Ihr Konstruktor nimmt color und radius entgegen und übergibt color an super. Implementieren Sie area() so, dass sie 3.14 * radius * radius zurückgibt, und perimeter() so, dass sie 2 * 3.14 * radius zurückgibt.
  • rectangle.dart: Erstellen Sie eine Klasse Rectangle, die Shape erweitert. Sie hat final Felder width und height (beide double). Ihr Konstruktor nimmt color, width und height entgegen und übergibt color an super. Implementieren Sie area() so, dass sie width * height zurückgibt, und perimeter() so, dass sie 2 * (width + height) zurückgibt.
  • main.dart: Importieren Sie alle Dateien. Erstellen Sie einen Circle mit der Farbe 'red' und dem Radius 5.0 sowie ein Rectangle mit der Farbe 'blue', der Breite 4.0 und der Höhe 6.0. Rufen Sie describe() für jede Form auf. Erstellen Sie dann eine List<Shape>, die beide Formen enthält, durchlaufen Sie die Liste in einer Schleife und geben Sie Area: [area] für jede Form aus.

Erwartete Ausgabe:

A red shape with area: 78.5 and perimeter: 31.400000000000002
A blue shape with area: 24.0 and perimeter: 20.0
Area: 78.5
Area: 24.0

Spickzettel

Eine abstrakte Methode ist eine Methode, die in einer abstrakten Klasse ohne Rumpf deklariert wird. Unterklassen müssen sie überschreiben, um ihre eigene Implementierung bereitzustellen.

abstract class Animal {
  // Abstrakte Methode - kein Rumpf
  String makeSound();

  // Konkrete Methode - hat einen Rumpf
  void breathe() {
    print('Breathing...');
  }
}

Unterklassen müssen alle abstrakten Methoden implementieren:

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';
  }
}

Sie können den abstrakten Typ als Variablentyp verwenden:

Animal a = Dog();
print(a.makeSound());  // Woof!

Animal b = Cat();
print(b.makeSound());  // Meow!
MerkmalAbstrakte MethodeKonkrete Methode
Hat RumpfNeinJa
Muss überschrieben werdenJaNein
ZweckVertrag erzwingenVerhalten teilen
WoNur abstrakte KlasseJede Klasse

Probier es selbst

import 'shape.dart';
import 'circle.dart';
import 'rectangle.dart';

void main() {
  // TODO: Erstelle einen Circle mit der Farbe 'red' und dem Radius 5.0

  // TODO: Erstelle ein Rectangle mit der Farbe 'blue', der Breite 4.0 und der Höhe 6.0

  // TODO: Rufe describe() für den circle auf

  // TODO: Rufe describe() für das rectangle auf

  // TODO: Erstelle eine List<Shape>, die beide Formen enthält

  // TODO: Iteriere durch die Liste und gib "Area: [area]" für jede Form 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