Menu
Coddy logo textTech

Composizione di interfacce

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 31 di 107.

Go ti consente di creare interfacce più grandi componendo interfacce più piccole. Invece di definire un’unica grande interfaccia con molti metodi, incorpori interfacce esistenti nella definizione di una nuova interfaccia.

type Reader interface {
    Read() string
}

type Writer interface {
    Write(data string)
}

// ReadWriter combina entrambe le interfacce
type ReadWriter interface {
    Reader
    Writer
}

L'interfaccia ReadWriter ora richiede entrambi i metodi Read() e Write(). Qualsiasi tipo che implementi entrambi i metodi soddisfa ReadWriter, oltre a soddisfare individualmente Reader e 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 soddisfa ReadWriter
}

Questo approccio di composizione mantiene le interfacce piccole e mirate. Puoi combinarle come necessario, creando contratti precisi per le tue funzioni. La libreria standard di Go usa ampiamente questo schema, ad esempio io.ReadWriter, che combina io.Reader e io.Writer.

challenge icon

Sfida

Facile

Costruiamo un sistema di riproduzione multimediale che mostri la composizione delle interfacce. Creerai interfacce piccole e mirate, per poi combinarle in un’interfaccia composta più potente che un singolo tipo può soddisfare.

Organizzerai il codice in due file:

  • media.go: definisci tre interfacce e una struct che le implementa tutte:
    • Un’interfaccia Player con un metodo Play() string
    • Un’interfaccia Recorder con un metodo Record(content string) string
    • Un’interfaccia MediaDevice che compone sia Player sia Recorder
    • Una struct SmartDevice con un campo Name che implementa tutti i metodi richiesti
  • main.go: crea funzioni che mostrino come lo stesso SmartDevice possa essere usato attraverso diversi tipi di interfaccia. Scrivi tre funzioni:
    • UsePlayer che accetta un Player e chiama il suo metodo Play
    • UseRecorder che accetta un Recorder e una stringa di contenuto, quindi chiama Record
    • UseMediaDevice che accetta un MediaDevice e una stringa di contenuto, quindi chiama sia Record sia Play
    Leggi il nome del dispositivo e il contenuto dall’input, crea uno SmartDevice e mostra come usarlo attraverso tutti e tre i tipi di interfaccia.

Verranno forniti i seguenti input:

  • Riga 1: nome del dispositivo
  • Riga 2: contenuto da registrare

I tuoi metodi devono restituire stringhe nei seguenti formati:

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

Per esempio, dati MyPhone e voice memo, il tuo output dovrebbe essere:

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

Le prime due righe mostrano il dispositivo usato attraverso le singole interfacce (Player e Recorder). Le ultime due righe mostrano il dispositivo usato attraverso l’interfaccia composta MediaDevice, che richiede entrambe le funzionalità. Nota come il tuo singolo SmartDevice soddisfi tutte e tre le interfacce perché dispone di entrambi i metodi richiesti.

Provalo tu

package main

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

// TODO: Implementa UsePlayer in modo che accetti un Player e chiami il suo metodo Play
// Deve stampare il risultato di Play()

// TODO: Implementa UseRecorder in modo che accetti un Recorder e una stringa content
// Deve stampare il risultato di Record(content)

// TODO: Implementa UseMediaDevice in modo che accetti un MediaDevice e una stringa content
// Deve stampare il risultato di Record(content) e poi di Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	deviceName := scanner.Text()
	
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Crea uno SmartDevice con il nome fornito
	
	// TODO: Usa il dispositivo tramite l'interfaccia Player
	
	// TODO: Usa il dispositivo tramite l'interfaccia Recorder
	
	// TODO: Usa il dispositivo tramite l'interfaccia MediaDevice
	
	_ = deviceName
	_ = content
	fmt.Println("Implement the solution")
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online