Mehrere Interfaces
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 48 von 110.
Einer der größten Vorteile von Interfaces gegenüber Vererbung ist, dass eine Klasse mehrere Interfaces implementieren kann. Während Dart dich darauf beschränkt, nur eine Klasse zu erweitern, kannst du so viele Interfaces implementieren, wie du benötigst.
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
abstract class Shareable {
void share(String recipient);
}
class Document implements Printable, Saveable, Shareable {
String content;
Document(this.content);
@override
void printContent() {
print('Printing: $content');
}
@override
void save() {
print('Saving document...');
}
@override
void share(String recipient) {
print('Sharing with $recipient');
}
}Bei der Implementierung mehrerer Schnittstellen müssen Sie Implementierungen für alle Methoden jeder Schnittstelle bereitstellen. Die Klasse muss alle Verträge erfüllen, die sie zu unterstützen verspricht.
Sie können auch extends mit mehreren implements kombinieren:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Muss weiterhin alle Interface-Methoden implementieren
// (in diesem Fall bereits von Document geerbt)
}Diese Flexibilität ermöglicht es Ihnen, Klassen zu entwerfen, die in mehrere Rollen passen. Ein SmartPhone könnte die Schnittstellen Camera, Phone und MusicPlayer implementieren und damit versprechen, dass es alles kann, was jede Schnittstelle erfordert, während es seine eigene, einzigartige Implementierung beibehält.
Aufgabe
EinfachErstellen wir ein intelligentes Gerätesystem, das veranschaulicht, wie eine einzelne Klasse mehrere Schnittstellen implementieren kann, um verschiedene Fähigkeiten zu kombinieren. Du erstellst separate Schnittstellenklassen für die verschiedenen Gerätefunktionen und baust anschließend ein Gerät, das all dies kann.
Du organisierst deinen Code in zwei Dateien:
devices.dart: Definiere hier deine Schnittstellen und die implementierende Klasse:- Eine
Connectable-Klasse mit einer Methodeconnect(), dieConnecting to network...ausgibt - Eine
Chargeable-Klasse mit einer Methodecharge(), dieCharging battery...ausgibt - Eine
Displayable-Klasse mit einer MethodeshowScreen(String content), dieDisplaying: [content]ausgibt - Eine
Tablet-Klasse, die alle drei Schnittstellen implementiert:Connectable,ChargeableundDisplayable. Füge eineString brand-Eigenschaft mit einem Konstruktor hinzu. Deine Implementierungen sollten bei connect[brand] tablet connecting to WiFi, bei charge[brand] tablet charging via USB-Cund bei showScreen[brand] screen: [content]ausgeben
- Eine
main.dart: Importiere deine Gerätedatei und zeige, wie das Tablet alle drei Schnittstellenverträge erfüllt:- Erstelle ein
Tabletmit der Marke'Galaxy' - Rufe
connect()auf - Rufe
charge()auf - Rufe
showScreen('Welcome Home')auf
- Erstelle ein
Deine Tablet-Klasse muss für jede Methode aus allen drei Schnittstellen eine eigene Implementierung bereitstellen. Dies zeigt, wie die Implementierung mehrerer Schnittstellen es einer einzelnen Klasse ermöglicht, mehrere Fähigkeiten zu versprechen, während jede Implementierung für das Gerät einzigartig bleibt.
Erwartete Ausgabe:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeProbier es selbst
import 'devices.dart';
void main() {
// TODO: Erstelle ein Tablet mit der Marke 'Galaxy'
// TODO: Rufe connect() auf
// TODO: Rufe charge() auf
// TODO: Rufe showScreen('Welcome Home') 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