Menu
Coddy logo textTech

Collezioni polimorfiche

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

Una delle applicazioni più potenti delle interfacce è memorizzare tipi diversi nella stessa raccolta. Una slice di un tipo di interfaccia può contenere qualsiasi valore che soddisfi tale interfaccia, consentendoti di raggruppare tipi correlati ma diversi.

Considera uno scenario in cui devi gestire varie forme. Invece di slice separate per ogni tipo, puoi usare una singola slice del tipo interfaccia:

type Shape interface {
    Area() float64
}

type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return 3.14159 * c.Radius * c.Radius }

type Rectangle struct{ Width, Height float64 }
func (r Rectangle) Area() float64 { return r.Width * r.Height }

func main() {
    shapes := []Shape{
        Circle{Radius: 5},
        Rectangle{Width: 4, Height: 3},
        Circle{Radius: 2},
    }
    
    for _, s := range shapes {
        fmt.Printf("Area: %.2f\n", s.Area())
    }
}

La slice shapes contiene sia cerchi che rettangoli. Durante l'iterazione, ogni elemento risponde a Area() in base al suo tipo effettivo. Questa è la polimorfia applicata alle collezioni: lo stesso ciclo gestisce uniformemente tutti i tipi di forme.

Le collezioni polimorfiche sono essenziali quando si creano sistemi che elaborano elementi diversi: un sistema di notifiche che invia email e messaggi SMS, un gioco che aggiorna diversi tipi di nemici o un elaboratore di documenti che gestisce più formati di file. Alla collezione non interessano i tipi specifici: conta solo che ogni elemento fornisca il comportamento richiesto.

challenge icon

Sfida

Facile

Creiamo un sistema di gestione delle attività che gestisce diversi tipi di attività tramite un'interfaccia unificata. Creerai vari tipi di attività e le elaborerai tutte insieme in una raccolta polimorfica.

Organizzerai il codice in tre file:

  • task.go: Definisci un'interfaccia Task che richiede un metodo Summary() string. Questa interfaccia sarà il contratto comune che tutti i tipi di attività devono rispettare.
  • types.go: Crea tre diversi tipi di attività che implementano ciascuno l'interfaccia Task:
    • BugFix con i campi ID (string) e Severity (string). Il suo Summary() restituisce Bug #[ID] ([Severity])
    • Feature con i campi Name (string) e Points (int). Il suo Summary() restituisce Feature: [Name] - [Points] pts
    • Documentation con il campo Topic (string). Il suo Summary() restituisce Docs: [Topic]
  • main.go: Crea una funzione chiamata PrintBacklog che accetta una slice di Task e stampa il riepilogo di ogni attività su una riga separata. Leggi i dettagli delle attività dall'input, crea un'attività per ciascun tipo, raccoglile tutte in un'unica slice []Task e passala a PrintBacklog.

Verranno forniti i seguenti input:

  • Riga 1: ID del bug
  • Riga 2: Gravità del bug
  • Riga 3: Nome della funzionalità
  • Riga 4: Punti della funzionalità (intero)
  • Riga 5: Argomento della documentazione

Ad esempio, dati 1042, critical, Dark Mode, 8 e API Reference, l'output dovrebbe essere:

Bug #1042 (critical)
Feature: Dark Mode - 8 pts
Docs: API Reference

Il vantaggio è che PrintBacklog non ha bisogno di una logica separata per bug, funzionalità o documentazione. Itera semplicemente attraverso la slice e chiama Summary() su ciascun elemento. Ogni tipo di attività risponde con il proprio formato specifico, dimostrando come le raccolte polimorfiche permettano di elaborare tipi diversi in modo uniforme.

Provalo tu

package main

import (
	"fmt"
)

// TODO: Crea una funzione PrintBacklog che accetti uno slice di Task
// e stampi il riepilogo di ogni attività su una riga separata

func main() {
	// Leggi l'input
	var bugID string
	var bugSeverity string
	var featureName string
	var featurePoints int
	var docTopic string

	fmt.Scanln(&bugID)
	fmt.Scanln(&bugSeverity)
	fmt.Scanln(&featureName)
	fmt.Scanln(&featurePoints)
	fmt.Scanln(&docTopic)

	// TODO: Crea un'istanza per ogni tipo di attività (BugFix, Feature, Documentation)

	// TODO: Raccogli tutte le attività in un unico slice []Task

	// TODO: Chiama PrintBacklog con lo slice delle attività
}
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