Menu
Coddy logo textTech

Implementieren vs. Erweitern

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

Nachdem Sie nun sowohl extends als auch implements verstehen, lassen Sie uns klären, wann welches verwendet werden sollte.

Verwenden Sie extends, wenn Sie Verhalten vererben möchten. Ihre Unterklasse erhält den gesamten Code der Elternklasse kostenlos 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();
}

Verwenden Sie implements, wenn Sie eine Struktur garantieren möchten, ohne Code zu erben. Sie müssen jede Methode selbst schreiben:

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

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

Denken Sie daran: Sie können nur eine Klasse erweitern, aber Sie können viele Schnittstellen implementieren. Wählen Sie extends für echte Vererbungsbeziehungen und implements, wenn Sie Flexibilität benötigen oder einen Vertrag erzwingen möchten, ohne Implementierungsdetails zu teilen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Arbeitersystem aufbauen, das demonstriert, wann extends im Gegensatz zu implements verwendet werden sollte. Sie werden eine Basisklasse für Arbeiter erstellen und dann beide Ansätze zeigen: eine Klasse, die wirklich ein Arbeiter "ist" und Verhalten erbt, und eine andere, die einfach das "kann", was ein Arbeiter tut, aber mit völlig eigener Logik.

Sie werden Ihren Code in zwei Dateien organisieren:

  • worker.dart: Definieren Sie hier Ihre Arbeiter-Hierarchie:
    • Eine Worker-Klasse mit einer String name-Eigenschaft und einem Konstruktor. Fügen Sie eine Methode work() hinzu, die [name] is working... ausgibt, und eine Methode takeBreak(), die [name] takes a coffee break ausgibt.
    • Eine OfficeWorker-Klasse, die Worker erweitert (extends). Fügen Sie eine String department-Eigenschaft hinzu. Überschreiben Sie work(), um [name] is typing reports in [department] auszugeben, aber behalten Sie das geerbte takeBreak()-Verhalten bei.
    • Eine RobotWorker-Klasse, die Worker implementiert (implements). Fügen Sie eine String model-Eigenschaft hinzu. Da Roboter nicht wirklich Arbeiter sind, aber das tun können, was Arbeiter tun, stellen Sie völlig eigene Implementierungen bereit: work() sollte Robot [model] is assembling parts ausgeben und takeBreak() sollte Robot [model] is recharging ausgeben.
  • main.dart: Importieren Sie Ihre Arbeiter-Datei und demonstrieren Sie beide Ansätze:
    • Erstellen Sie einen OfficeWorker namens 'Alice' in der Abteilung 'Marketing'
    • Erstellen Sie einen RobotWorker mit dem Modell 'RX-7'
    • Rufen Sie für den Büroangestellten work() und dann takeBreak() auf
    • Geben Sie eine Leerzeile aus
    • Rufen Sie für den Roboter-Arbeiter work() und dann takeBreak() auf

Beachten Sie, wie OfficeWorker die Methode takeBreak() automatisch erbt, weil sie Worker erweitert - sie "ist" wirklich ein Arbeiter. In der Zwischenzeit muss RobotWorker für alles eine eigene Implementierung bereitstellen, da sie nur das Interface implementiert - sie "kann" das, was ein Arbeiter tut, aber auf ihre eigene roboterhafte 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

Spickzettel

Verwenden Sie extends, um Verhalten von einer Elternklasse zu erben. Die Unterklasse erhält automatisch alle Methoden der Elternklasse und kann diese überschreiben:

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

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

void main() {
  var dog = Dog();
  dog.breathe();  // Inherited automatically
  dog.bark();
}

Verwenden Sie implements, um eine Struktur zu garantieren, ohne Code zu erben. Sie müssen für jede Methode eine eigene Implementierung bereitstellen:

class Robot implements Animal {
  @override
  void breathe() {
    print('Ventilating circuits...');
  }
}

Wichtige Unterschiede:

  • extends: „Ich bin ein Typ hiervon“ – echte Vererbung mit gemeinsam genutztem Code
  • implements: „Ich kann das, was dies tut“ – erzwingt einen Vertrag mit benutzerdefinierter Logik
  • Sie können nur eine Klasse erweitern, aber mehrere Schnittstellen implementieren

Wählen Sie extends für echte Eltern-Kind-Beziehungen, bei denen Verhalten geerbt werden soll. Wählen Sie implements, wenn Sie Flexibilität benötigen oder einen Vertrag erzwingen möchten, ohne die Implementierung zu teilen.

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: Rufe für den Büroangestellten work() und dann takeBreak() auf
  
  // TODO: Gib eine Leerzeile aus
  
  // TODO: Rufe für den RobotWorker 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