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.
Aufgabe
EinfachErstelle 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 einerString name-Eigenschaft und einem Konstruktor. Füge eine Methodework()hinzu, die[name] is working...ausgibt, sowie eine MethodetakeBreak(), die[name] takes a coffee breakausgibt. - Eine
OfficeWorker-Klasse, die extendsWorker. Füge eineString department-Eigenschaft hinzu. Überschreibework(), sodass[name] is typing reports in [department]ausgegeben wird, behalte aber das geerbte Verhalten vontakeBreak()bei. - Eine
RobotWorker-Klasse, die implementsWorker. Füge eineString model-Eigenschaft hinzu. Da Roboter keine echten Arbeiter sind, aber das tun können, was Arbeiter tun, stelle vollständig eigene Implementierungen bereit:work()sollRobot [model] is assembling partsausgeben undtakeBreak()sollRobot [model] is rechargingausgeben.
- Eine
main.dart: Importiere deine Worker-Datei und demonstriere beide Ansätze:- Erstelle einen
OfficeWorkernamens'Alice'in der Abteilung'Marketing'. - Erstelle einen
RobotWorkermit dem Modell'RX-7'. - Rufe für den Büroarbeiter zuerst
work()und danntakeBreak()auf. - Gib eine leere Zeile aus.
- Rufe für den Roboterarbeiter zuerst
work()und danntakeBreak()auf.
- Erstelle einen
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 rechargingProbier 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
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler