Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 Methode connect(), die Connecting to network... ausgibt.
    • Eine Chargeable-Klasse mit einer Methode charge(), die Charging battery... ausgibt.
    • Eine Displayable-Klasse mit einer Methode showScreen(String content), die Displaying: [content] ausgibt.
    • Eine Tablet-Klasse, die alle drei Interfaces implementiert: Connectable, Chargeable und Displayable. Fügen Sie eine String brand-Eigenschaft mit einem Konstruktor hinzu. Ihre Implementierungen sollten [brand] tablet connecting to WiFi für connect, [brand] tablet charging via USB-C für charge und [brand] screen: [content] für showScreen ausgeben.
  • main.dart: Importieren Sie Ihre devices-Datei und demonstrieren Sie, wie das Tablet alle drei Interface-Verträge erfüllt:
    • Erstellen Sie ein Tablet mit der Marke 'Galaxy'
    • Rufen Sie connect() auf
    • Rufen Sie charge() auf
    • Rufen Sie showScreen('Welcome Home') auf

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 Home

Spickzettel

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
  
}
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