Menu
Coddy logo textTech

Promotion des méthodes

Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 36 sur 107.

Tout comme l’intégration de struct promeut les champs vers la struct externe, Go promeut également les méthodes des types intégrés. Cela signifie que vous pouvez appeler les méthodes définies sur la struct intégrée directement sur la struct externe.

type Engine struct {
    Horsepower int
}

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

type Car struct {
    Model string
    Engine  // embarqué
}

Puisque Car intègre Engine, la method Start() est automatiquement promue :

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Moteur démarré
    fmt.Println(c.Engine.Start())  // fonctionne aussi
}

Cette promotion a une conséquence importante pour les interfaces. Si le type intégré satisfait une interface, le type externe la satisfait automatiquement lui aussi :

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 satisfait Starter via Engine
}

Le type Car n’implémente jamais explicitement Starter, mais il satisfait à l’interface, car son Engine intégré possède la méthode requise. C’est ainsi que Go permet la réutilisation des comportements sans héritage traditionnel.

challenge icon

Défi

Facile

Construisons un système de lecteur de musique qui montre comment les méthodes des types intégrés sont promues vers le type externe, et comment cela permet de satisfaire une interface grâce à la composition.

Vous organiserez votre code sur deux fichiers :

  • audio.go : créez les éléments de base de votre lecteur de musique :
    • Une structure AudioPlayer avec un champ Brand (chaîne de caractères) et une méthode Play() string qui renvoie [Brand] playing audio
    • Une interface Playable nécessitant une méthode Play() string
    • Une structure Smartphone avec un champ Model qui intègre AudioPlayer
    • Une structure Tablet avec un champ Model qui intègre AudioPlayer
  • main.go : créez une fonction appelée StartPlayback qui accepte n’importe quel Playable et renvoie le résultat de l’appel à Play(). Lisez les informations sur les appareils depuis l’entrée, créez à la fois un Smartphone et une Tablet, et démontrez qu’ils satisfont tous deux l’interface Playable grâce à leur AudioPlayer intégré, même si aucun de ces types n’implémente explicitement Play() lui-même.

Les entrées suivantes seront fournies :

  • Ligne 1 : nom du modèle du Smartphone
  • Ligne 2 : marque audio du Smartphone
  • Ligne 3 : nom du modèle de la Tablet
  • Ligne 4 : marque audio de la Tablet

Pour chaque appareil, affichez son modèle, suivi du résultat de son passage à StartPlayback.

Par exemple, avec iPhone 15, Apple Audio, iPad Pro et Beats, votre sortie doit être :

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

Remarquez que Smartphone et Tablet peuvent tous deux être transmis à StartPlayback, car la méthode Play() de AudioPlayer est automatiquement promue vers chaque type externe, ce qui lui permet de satisfaire l’interface Playable sans aucun code supplémentaire.

Essayez vous-même

package main

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

// TODO: Créer une fonction StartPlayback qui accepte n'importe quel Playable
// et renvoie le résultat de l'appel à Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Lire le modèle du smartphone
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// Lire la marque audio du smartphone
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// Lire le modèle de la tablette
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// Lire la marque audio de la tablette
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: Créer un Smartphone avec l'AudioPlayer intégré
	
	// TODO: Créer une Tablet avec l'AudioPlayer intégré
	
	// TODO: Afficher le modèle du smartphone, puis appeler StartPlayback avec le smartphone
	
	// TODO: Afficher le modèle de la tablette, puis appeler StartPlayback avec la tablette
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Go en ligne