Menu
Coddy logo textTech

Implementieren vs. Erweitern

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

Da du nun sowohl extends als auch implements verstehst, klären wir, wann du welches verwenden solltest.

Verwende extends, wenn du Verhalten erben möchtest. Deine Unterklasse erhält den gesamten Code der übergeordneten Klasse automatisch und kann darauf aufbauen:

class Animal {
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  void bark() {
    print('Woof!');
  }
}

void main() {
  var dog = Dog();
  dog.breathe();  // Vererbt – funktioniert automatisch
  dog.bark();
}

Verwende implements, wenn du eine Struktur garantieren möchtest, ohne Code zu erben. Du musst jede Methode selbst schreiben:

class Robot implements Animal {
  @override
  void breathe() {
    print('Ventilating circuits...');  // Vollständig benutzerdefinierte Implementierung
  }
}

Der wesentliche Unterschied: extends sagt „Ich bin ein Typ davon“, während implements sagt „Ich kann das tun, was dieses tut.“ Ein Dog ist ein Animal und atmet auf dieselbe Weise. Ein Robot ist kein Tier, kann aber denselben Vertrag mit seiner eigenen Logik erfüllen.

Denke daran: Du kannst nur eine Klasse erweitern, aber viele Schnittstellen implementieren. Wähle extends für echte Vererbungsbeziehungen und implements, wenn du Flexibilität benötigst oder einen Vertrag durchsetzen möchtest, ohne Implementierungsdetails gemeinsam zu nutzen.

challenge icon

Aufgabe

Einfach

Erstelle ein Arbeitersystem, das zeigt, wann extends und wann implements verwendet wird. Du erstellst eine Basisklasse für Arbeiter und zeigst anschließend beide Ansätze: eine Klasse, die wirklich ein Arbeiter ist und Verhalten erbt, und eine andere, die lediglich das tun kann, was ein Arbeiter tut, aber mit vollständig eigener Logik.

Organisiere deinen Code in zwei Dateien:

  • worker.dart: Definiere hier deine Arbeiterhierarchie:
    • Eine Worker-Klasse mit einer String name-Eigenschaft und einem Konstruktor. Füge eine Methode work() hinzu, die [name] is working... ausgibt, sowie eine Methode takeBreak(), die [name] takes a coffee break ausgibt.
    • Eine OfficeWorker-Klasse, die extends Worker. Füge eine String department-Eigenschaft hinzu. Überschreibe work(), sodass [name] is typing reports in [department] ausgegeben wird, behalte aber das geerbte Verhalten von takeBreak() bei.
    • Eine RobotWorker-Klasse, die implements Worker. Füge eine String model-Eigenschaft hinzu. Da Roboter keine echten Arbeiter sind, aber das tun können, was Arbeiter tun, stelle vollständig eigene Implementierungen bereit: work() soll Robot [model] is assembling parts ausgeben und takeBreak() soll Robot [model] is recharging ausgeben.
  • main.dart: Importiere deine Worker-Datei und demonstriere beide Ansätze:
    • Erstelle einen OfficeWorker namens 'Alice' in der Abteilung 'Marketing'.
    • Erstelle einen RobotWorker mit dem Modell 'RX-7'.
    • Rufe für den Büroarbeiter zuerst work() und dann takeBreak() auf.
    • Gib eine leere Zeile aus.
    • Rufe für den Roboterarbeiter zuerst work() und dann takeBreak() auf.

Beachte, wie OfficeWorker takeBreak() automatisch erbt, weil es Worker erweitert – es ist wirklich ein Arbeiter. RobotWorker muss dagegen für alles eine eigene Implementierung bereitstellen, weil es lediglich die Schnittstelle implementiert – es kann das tun, was ein Arbeiter tut, aber auf seine eigene robotische Weise.

Erwartete Ausgabe:

Alice is typing reports in Marketing
Alice takes a coffee break

Robot RX-7 is assembling parts
Robot RX-7 is recharging

Probier es selbst

import 'worker.dart';

void main() {
  // TODO: Erstelle einen OfficeWorker namens 'Alice' in der Abteilung 'Marketing'
  
  // TODO: Erstelle einen RobotWorker mit dem Modell 'RX-7'
  
  // TODO: Für den OfficeWorker rufe work() und dann takeBreak() auf
  
  // TODO: Gib eine leere Zeile aus
  
  // TODO: Für den RobotWorker rufe work() und dann takeBreak() 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

Übe selbstständig: Online-Dart-Compiler