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.
Défi
FacileConstruisons 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
AudioPlayeravec un champBrand(chaîne de caractères) et une méthodePlay() stringqui renvoie[Brand] playing audio - Une interface
Playablenécessitant une méthodePlay() string - Une structure
Smartphoneavec un champModelqui intègreAudioPlayer - Une structure
Tabletavec un champModelqui intègreAudioPlayer
- Une structure
main.go: créez une fonction appeléeStartPlaybackqui accepte n’importe quelPlayableet 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’interfacePlayablegrâce à leurAudioPlayerintégré, même si aucun de ces types n’implémente explicitementPlay()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 audioRemarquez 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")
}
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
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et modules GoPackages et importsNoms exportés et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workersEntraînez-vous par vous-même : Compilateur Go en ligne