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

Erstellen wir einen Formrechner, der abstrakte Methoden in Aktion demonstriert. Du definierst eine abstrakte Klasse mit abstrakten Methoden, die jede Form unterschiedlich implementieren muss, und verwendest diese Formen anschließend über eine gemeinsame Schnittstelle.

Du organisierst deinen Code in vier Dateien:

  • shape.dart: Definiere eine abstrakte Klasse Shape mit einem final-Feld color (String) und einem Konstruktor, der es initialisiert. Deklariere zwei abstrakte Methoden: double area() und double perimeter(). Füge außerdem eine konkrete Methode describe() hinzu, die A [color] shape with area: [area] and perimeter: [perimeter] ausgibt. Da area() und perimeter() abstrakt sind, stellt jede Unterklasse ihre eigene Berechnung bereit, aber describe() funktioniert für alle, ohne überschrieben werden zu müssen.
  • circle.dart: Erstelle eine Klasse Circle, die Shape erweitert. Sie besitzt ein final-Feld radius (double). Ihr Konstruktor übernimmt color und radius und übergibt color an super. Implementiere area() so, dass 3.14 * radius * radius zurückgegeben wird, und perimeter() so, dass 2 * 3.14 * radius zurückgegeben wird.
  • rectangle.dart: Erstelle eine Klasse Rectangle, die Shape erweitert. Sie besitzt die final-Felder width und height (beide double). Ihr Konstruktor übernimmt color, width und height und übergibt color an super. Implementiere area() so, dass width * height zurückgegeben wird, und perimeter() so, dass 2 * (width + height) zurückgegeben wird.
  • main.dart: Importiere alle Dateien. Erstelle 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. Rufe für jede Form describe() auf. Erstelle anschließend eine List<Shape>, die beide Formen enthält, durchlaufe die Liste und gib für jede Form Area: [area] 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

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

Übe selbstständig: Online-Dart-Compiler