Menu
Coddy logo textTech

Polymorphismus über Interfaces

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 58 von 110.

In der vorherigen Lektion haben Sie Polymorphismus durch Vererbung kennengelernt – die Verwendung eines Basisklassentyps, um mit Kindobjekten zu arbeiten. Aber Polymorphismus funktioniert auch über Schnittstellen, und dieser Ansatz ist oft flexibler.

Wenn Klassen dieselbe Schnittstelle implementieren, kannst du sie polymorph behandeln, auch wenn sie keine Vererbungsbeziehung haben:

abstract class Printable {
  void printDetails();
}

class Invoice implements Printable {
  @override
  void printDetails() => print('Invoice #1234');
}

class Report implements Printable {
  @override
  void printDetails() => print('Monthly Report');
}

class Receipt implements Printable {
  @override
  void printDetails() => print('Receipt for purchase');
}

void printAll(List<Printable> items) {
  for (var item in items) {
    item.printDetails();
  }
}

void main() {
  var documents = [Invoice(), Report(), Receipt()];
  printAll(documents);
}

Invoice, Report und Receipt sind völlig voneinander unabhängige Klassen – sie teilen keine gemeinsame Elternklasse. Da sie jedoch alle Printable implementieren, können wir sie in derselben Liste speichern und für jede einzelne printDetails() aufrufen.

Das ist leistungsstark, weil du damit Verhaltensverträge definieren kannst, ohne eine Vererbungshierarchie zu erzwingen. Jede Klasse kann ein Interface implementieren, unabhängig davon, wovon sie erbt. Dein Code wird modularer, da du neue druckbare Typen hinzufügen kannst, ohne bestehenden Code zu ändern – implementiere einfach das Interface.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Mediaplayer-System, das Polymorphie durch Schnittstellen demonstriert. Du erstellst eine Schnittstelle, die definiert, was es bedeutet, „abspielbar“ zu sein, und implementierst dann mehrere unabhängige Medientypen, die diesen Vertrag erfüllen – dadurch können sie einheitlich verarbeitet werden, obwohl sie keine Vererbungsbeziehung haben.

Du organisierst deinen Code in zwei Dateien:

  • media.dart: Definiere hier deine Schnittstelle und Medienklassen:
    • Eine abstrakte Klasse Playable mit zwei abstrakten Methoden: play() und String getMediaType()
    • Eine Klasse Song, die Playable implementiert. Sie sollte über String title und String artist verfügen. Ihre Methode play() gibt Playing song: [title] by [artist] aus, und getMediaType() gibt 'Audio' zurück
    • Eine Klasse Video, die Playable implementiert. Sie sollte über String title und int duration (in Minuten) verfügen. Ihre Methode play() gibt Playing video: [title] ([duration] min) aus, und getMediaType() gibt 'Video' zurück
    • Eine Klasse Podcast, die Playable implementiert. Sie sollte über String title und int episode verfügen. Ihre Methode play() gibt Playing podcast: [title] - Episode [episode] aus, und getMediaType() gibt 'Podcast' zurück
    Erstelle außerdem eine Funktion playAll(List<Playable> playlist), die die Liste durchläuft und für jedes Element [Media Type]: ausgibt, gefolgt vom Aufruf von play() für dieses Element.
  • main.dart: Importiere deine Mediendatei und demonstriere die schnittstellenbasierte Polymorphie:
    • Erstelle eine List<Playable>, die einen Song mit dem Titel 'Imagine' und dem Interpreten 'John Lennon', ein Video mit dem Titel 'Dart Tutorial' und der Dauer 15 sowie einen Podcast mit dem Titel 'Tech Talk' und der Episodennummer 42 enthält
    • Übergib diese Liste an playAll()

Beachte, dass Song, Video und Podcast keine gemeinsame übergeordnete Klasse haben – es handelt sich um vollständig unabhängige Typen. Da sie jedoch alle Playable implementieren, kannst du sie in derselben Liste speichern und über die Schnittstelle einheitlich behandeln.

Erwartete Ausgabe:

Audio:
Playing song: Imagine by John Lennon
Video:
Playing video: Dart Tutorial (15 min)
Podcast:
Playing podcast: Tech Talk - Episode 42

Probier es selbst

import 'media.dart';

void main() {
  // TODO: Erstelle eine List<Playable>, die Folgendes enthält:
  // - Einen Song mit dem Titel 'Imagine' und dem Künstler 'John Lennon'
  // - Ein Video mit dem Titel 'Dart Tutorial' und der Dauer 15
  // - Einen Podcast mit dem Titel 'Tech Talk' und der Episode 42
  
  // TODO: Übergib die Liste an playAll()
}
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

Übe selbstständig: Online-Dart-Compiler