Introduction aux interfaces
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy. Leçon 25 sur 107.
Une interface en Go définit un ensemble de signatures de méthodes sans les implémenter. Elle décrit ce qu’un type peut faire, et non comment il le fait. Tout type qui implémente toutes les méthodes d’une interface satisfait automatiquement cette interface.
Voici comment définir une interface :
type Speaker interface {
Speak() string
}Cette interface Speaker exige que tout type qui l’implémente possède une méthode Speak() qui renvoie une chaîne. Désormais, toute structure dotée de cette méthode peut être utilisée partout où un Speaker est attendu.
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return d.Name + " says woof!"
}
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return c.Name + " says meow!"
}Dog et Cat satisfont tous deux à l’interface Speaker, car ils possèdent chacun une méthode Speak() avec la signature correcte. Vous pouvez maintenant écrire des fonctions qui acceptent n’importe quel Speaker :
func MakeSound(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
dog := Dog{Name: "Buddy"}
cat := Cat{Name: "Whiskers"}
MakeSound(dog) // Buddy dit ouaf !
MakeSound(cat) // Whiskers dit miaou !
}Les interfaces vous permettent d’écrire du code flexible et réutilisable qui fonctionne avec tout type répondant aux exigences de l’interface, quelle que soit l’implémentation sous-jacente.
Défi
FacileConstruisons un système de description de véhicules qui montre comment les interfaces permettent à différents types de partager un comportement commun. Vous allez créer une interface que plusieurs types de véhicules peuvent satisfaire, puis l'utiliser pour décrire uniformément n'importe quel véhicule.
Vous allez organiser votre code sur deux fichiers :
vehicles.go: définissez une interfaceDescriberavec une seule méthodeDescribe() string. Créez ensuite deux structures qui satisfont cette interface :Caravec les champsBrandetModel(tous deux de type chaîne de caractères)Bicycleavec les champsType(chaîne de caractères) etGears(entier)
Describe()qui renvoie une chaîne descriptive du véhicule.main.go: créez une fonction appeléePrintDescriptionqui accepte n'importe quelDescriberet affiche le résultat de l'appel de sa méthodeDescribe(). Lisez les informations sur les véhicules depuis l'entrée, créez un Car et un Bicycle, puis utilisez votre fonction pour afficher la description de chacun.
Les entrées suivantes seront fournies :
- Ligne 1 : marque de la voiture
- Ligne 2 : modèle de la voiture
- Ligne 3 : type de bicyclette
- Ligne 4 : nombre de vitesses (entier)
Vos méthodes Describe() doivent renvoyer des chaînes dans les formats suivants :
- Car :
[Brand] [Model] - Bicycle :
[Type] bike with [Gears] gears
Par exemple, avec Toyota, Camry, Mountain et 21, votre sortie devrait être :
Toyota Camry
Mountain bike with 21 gearsL'idée essentielle est que votre fonction PrintDescription fonctionne avec tout type possédant une méthode Describe(). Elle n'a pas besoin de savoir si elle traite un Car, un Bicycle ou tout autre type de véhicule que vous pourriez ajouter ultérieurement.
Essayez vous-même
package main
import (
"fmt"
)
// TODO: Créer une fonction PrintDescription qui accepte n'importe quel Describer
// et imprime le résultat de l'appel de sa méthode Describe()
func main() {
// Lire l'entrée
var carBrand string
var carModel string
var bicycleType string
var gears int
fmt.Scanln(&carBrand)
fmt.Scanln(&carModel)
fmt.Scanln(&bicycleType)
fmt.Scanln(&gears)
// TODO: Créer une Car avec la marque et le modèle issus de l'entrée
// TODO: Créer une Bicycle avec le type et les vitesses issus de l'entrée
// TODO: Utiliser PrintDescription pour imprimer la description de la voiture
// TODO: Utiliser PrintDescription pour imprimer la description du vélo
}
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