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

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Smart-Device-System bauen, das demonstriert, wie eine einzelne Klasse mehrere Interfaces implementieren kann, um verschiedene Fähigkeiten zu kombinieren. Sie werden separate Interface-Klassen für verschiedene Gerätefunktionen erstellen und dann ein Gerät bauen, das alles kann.

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

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