Menu
Coddy logo textTech

Promozione dei metodi

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

Proprio come l'incorporamento di struct promuove i campi nella struct esterna, Go promuove anche i metodi dei tipi incorporati. Questo significa che puoi chiamare i metodi definiti sulla struct incorporata direttamente sulla struct esterna.

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // incorporato
}

Poiché Car incorpora Engine, il metodo Start() viene promosso automaticamente:

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Motor arrancado
    fmt.Println(c.Engine.Start())  // también funciona
}

Questa promozione ha una conseguenza importante per le interfacce. Se il tipo incorporato soddisfa un'interfaccia, anche il tipo esterno la soddisfa automaticamente:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car soddisfa Starter tramite Engine
}

Il tipo Car non implementa mai esplicitamente Starter, eppure soddisfa l’interfaccia perché il suo Engine incorporato ha il metodo richiesto. È così che Go consente di riutilizzare il comportamento senza ricorrere all’ereditarietà tradizionale.

challenge icon

Sfida

Facile

Costruiamo un sistema di riproduzione musicale che dimostri come i metodi dei tipi incorporati vengono promossi al tipo esterno e come ciò consenta di soddisfare un’interfaccia tramite composizione.

Organizzerai il codice in due file:

  • audio.go: crea gli elementi costitutivi del tuo riproduttore musicale:
    • Una struttura AudioPlayer con un campo Brand (stringa) e un metodo Play() string che restituisce [Brand] playing audio
    • Un’interfaccia Playable che richiede un metodo Play() string
    • Una struttura Smartphone con un campo Model che incorpora AudioPlayer
    • Una struttura Tablet con un campo Model che incorpora AudioPlayer
  • main.go: crea una funzione chiamata StartPlayback che accetta qualsiasi Playable e restituisce il risultato della chiamata a Play(). Leggi le informazioni sui dispositivi dall’input, crea uno Smartphone e un Tablet e dimostra che entrambi soddisfano l’interfaccia Playable tramite il loro AudioPlayer incorporato, anche se nessuno dei due tipi implementa esplicitamente Play().

Verranno forniti i seguenti input:

  • Riga 1: nome del modello dello Smartphone
  • Riga 2: marca audio dello Smartphone
  • Riga 3: nome del modello del Tablet
  • Riga 4: marca audio del Tablet

Per ciascun dispositivo, stampa il suo modello seguito dal risultato del passaggio a StartPlayback.

Ad esempio, dati iPhone 15, Apple Audio, iPad Pro e Beats, l’output dovrebbe essere:

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

Nota come sia Smartphone sia Tablet possano essere passati a StartPlayback perché il metodo Play() di AudioPlayer viene promosso automaticamente a ciascun tipo esterno, soddisfacendo l’interfaccia Playable senza bisogno di codice aggiuntivo.

Provalo tu

package main

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

// TODO: Crea una funzione StartPlayback che accetti qualsiasi Playable
// e restituisca il risultato della chiamata a Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Leggi il modello dello smartphone
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// Leggi la marca del sistema audio dello smartphone
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// Leggi il modello del tablet
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// Leggi la marca del sistema audio del tablet
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: Crea uno Smartphone con AudioPlayer incorporato
	
	// TODO: Crea un Tablet con AudioPlayer incorporato
	
	// TODO: Stampa il modello dello smartphone, poi chiama StartPlayback con lo smartphone
	
	// TODO: Stampa il modello del tablet, poi chiama StartPlayback con il tablet
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
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