Mehrfache 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 Sie darauf beschränkt, nur eine Klasse zu erweitern, können Sie so viele Interfaces implementieren, wie Sie benötigen.
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
EinfachLassen Sie uns ein Smart-Device-System bauen, das zeigt, wie eine einzelne Klasse mehrere Interfaces implementieren kann, um verschiedene Funktionen zu kombinieren. Sie werden separate Interface-Klassen für verschiedene Gerätefunktionen erstellen und dann ein Gerät bauen, das alles beherrscht.
Sie werden Ihren Code in zwei Dateien organisieren:
devices.dart: Definieren Sie hier Ihre Interfaces 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 Interfaces implementiert:Connectable,ChargeableundDisplayable. Fügen Sie eineString brand-Eigenschaft mit einem Konstruktor hinzu. Ihre Implementierungen sollten[brand] tablet connecting to WiFifür connect,[brand] tablet charging via USB-Cfür charge und[brand] screen: [content]für showScreen ausgeben.
- Eine
main.dart: Importieren Sie Ihre devices-Datei und demonstrieren Sie, wie das Tablet alle drei Interface-Verträge erfüllt:- Erstellen Sie ein
Tabletmit der Marke'Galaxy' - Rufen Sie
connect()auf - Rufen Sie
charge()auf - Rufen Sie
showScreen('Welcome Home')auf
- Erstellen Sie ein
Ihre Tablet-Klasse muss für jede Methode aus allen drei Interfaces eine eigene Implementierung bereitstellen. Dies zeigt, wie die Implementierung mehrerer Interfaces es einer einzelnen Klasse ermöglicht, mehrere Funktionen zuzusichern, während jede Implementierung spezifisch für das Gerät bleibt.
Erwartete Ausgabe:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome HomeSpickzettel
Eine Klasse kann mehrere Schnittstellen implementieren, indem sie nach dem Schlüsselwort implements durch Kommas getrennt aufgelistet werden:
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
class Document implements Printable, Saveable {
@override
void printContent() {
print('Printing...');
}
@override
void save() {
print('Saving...');
}
}Wenn Sie mehrere Schnittstellen implementieren, müssen Sie Implementierungen für alle Methoden jeder Schnittstelle bereitstellen.
Sie können extends mit mehreren implements kombinieren:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// Muss alle Schnittstellenmethoden implementieren
}Dies ermöglicht es einer Klasse, mehrere Verträge zu erfüllen und gleichzeitig mehrere Rollen einzunehmen.
Probier 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 this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor