Menu
Coddy logo textTech

Zusammensetzung von Schnittstellen

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 31 von 107.

Mit Go kannst du größere Schnittstellen erstellen, indem du kleinere zusammensetzt. Anstatt eine große Schnittstelle mit vielen Methoden zu definieren, bettest du vorhandene Schnittstellen in eine neue Schnittstellendefinition ein.

type Reader interface {
    Read() string
}

type Writer interface {
    Write(data string)
}

// ReadWriter kombiniert beide Schnittstellen
type ReadWriter interface {
    Reader
    Writer
}

Die Schnittstelle ReadWriter erfordert jetzt sowohl die Methoden Read() als auch Write(). Jeder Typ, der beide Methoden implementiert, erfüllt ReadWriter sowie einzeln auch Reader und Writer.

type File struct {
    Name string
}

func (f File) Read() string       { return "file content" }
func (f File) Write(data string)  { fmt.Println("Writing:", data) }

func Process(rw ReadWriter) {
    content := rw.Read()
    rw.Write(content)
}

func main() {
    f := File{Name: "data.txt"}
    Process(f)  // File erfüllt ReadWriter
}

Dieser Kompositionsansatz hält Interfaces klein und fokussiert. Sie können sie nach Bedarf kombinieren und so präzise Verträge für Ihre Funktionen erstellen. Die Standardbibliothek von Go nutzt dieses Muster ausgiebig, wie zum Beispiel io.ReadWriter, das io.Reader und io.Writer kombiniert.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Mediaplayer-System, das die Komposition von Schnittstellen demonstriert. Du erstellst kleine, fokussierte Schnittstellen und kombinierst sie anschließend zu einer leistungsfähigeren zusammengesetzten Schnittstelle, die ein einzelner Typ erfüllen kann.

Du organisierst deinen Code über zwei Dateien:

  • media.go: Definiere drei Schnittstellen und eine Struktur, die sie alle implementiert:
    • Eine Player-Schnittstelle mit einer Play() string-Methode
    • Eine Recorder-Schnittstelle mit einer Record(content string) string-Methode
    • Eine MediaDevice-Schnittstelle, die sowohl Player als auch Recorder kombiniert
    • Eine SmartDevice-Struktur mit einem Name-Feld, die alle erforderlichen Methoden implementiert
  • main.go: Erstelle Funktionen, die demonstrieren, wie dasselbe SmartDevice über verschiedene Schnittstellentypen verwendet werden kann. Schreibe drei Funktionen:
    • UsePlayer, die ein Player-Objekt akzeptiert und dessen Play-Methode aufruft
    • UseRecorder, die ein Recorder-Objekt und eine Inhaltszeichenfolge akzeptiert und anschließend Record aufruft
    • UseMediaDevice, die ein MediaDevice-Objekt und eine Inhaltszeichenfolge akzeptiert und anschließend sowohl Record als auch Play aufruft
    Lies den Gerätenamen und den Inhalt aus der Eingabe, erstelle ein SmartDevice und demonstriere seine Verwendung über alle drei Schnittstellentypen.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Gerätename
  • Zeile 2: Aufzuzeichnender Inhalt

Deine Methoden sollten Zeichenfolgen in diesen Formaten zurückgeben:

  • Play(): [Name] is playing
  • Record(content): [Name] recorded: [content]

Wenn beispielsweise MyPhone und voice memo angegeben werden, sollte deine Ausgabe folgendermaßen aussehen:

MyPhone is playing
MyPhone recorded: voice memo
MyPhone recorded: voice memo
MyPhone is playing

Die ersten beiden Zeilen zeigen das Gerät, das über die einzelnen Schnittstellen (Player und Recorder) verwendet wird. Die letzten beiden Zeilen zeigen seine Verwendung über die zusammengesetzte MediaDevice-Schnittstelle, die beide Fähigkeiten erfordert. Beachte, dass dein einzelnes SmartDevice alle drei Schnittstellen erfüllt, da es über beide erforderlichen Methoden verfügt.

Probier es selbst

package main

import (
	"bufio"
	"fmt"
	"os"
)

// TODO: Implementiere UsePlayer, das einen Player akzeptiert und dessen Play-Methode aufruft
// Es sollte das Ergebnis von Play() ausgeben

// TODO: Implementiere UseRecorder, das einen Recorder und einen Inhalts-String akzeptiert
// Es sollte das Ergebnis von Record(content) ausgeben

// TODO: Implementiere UseMediaDevice, das ein MediaDevice und einen Inhalts-String akzeptiert
// Es sollte das Ergebnis von Record(content) und dann Play() ausgeben

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	deviceName := scanner.Text()
	
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Erstelle ein SmartDevice mit dem angegebenen Namen
	
	// TODO: Verwende das Gerät über das Player-Interface
	
	// TODO: Verwende das Gerät über das Recorder-Interface
	
	// TODO: Verwende das Gerät über das MediaDevice-Interface
	
	_ = deviceName
	_ = content
	fmt.Println("Implement the solution")
}
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-Go-Compiler