Implémenter une Interface
Fait partie de la section Logique & Flux du Journey GO de Coddy — leçon 14 sur 68.
Maintenant que vous savez comment définir une interface, apprenons comment les types Go les implémentent réellement. La chose la plus importante à comprendre est que Go utilise l'implémentation implicite - il n'y a pas de mot-clé ou de déclaration spéciale nécessaire.
Si un type possède toutes les méthodes requises par une interface, il satisfait automatiquement cette interface. Vous n'avez pas besoin de déclarer explicitement que votre type implémente l'interface - Go le détermine pour vous.
Voici comment cela fonctionne avec l'interface Shaper de la leçon précédente :
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Puisque le type Circle possède une méthode Area() qui retourne un float64, il implémente automatiquement l'interface Shaper. Il n'est pas nécessaire de déclarer cette relation explicitement - Go la reconnaît en se basant sur la correspondance de la signature de la méthode.
Cette approche implicite rend les interfaces Go incroyablement flexibles. N'importe quel type existant peut satisfaire une nouvelle interface tant qu'il possède les méthodes requises, même si l'interface a été créée après que le type a été écrit.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileDans ce défi, vous allez vous entraîner à implémenter une interface en créant un système de véhicule simple. Vous allez créer une structure Car qui implémente automatiquement une interface Vehicle grâce à l'implémentation implicite de Go.
Vous recevrez deux entrées :
- Une chaîne de caractères représentant la marque de la voiture (par exemple,
"Toyota") - Une chaîne de caractères représentant la vitesse de la voiture en km/h (par exemple,
"120")
Votre tâche consiste à :
- Définir une interface
Vehicleavec une signature de méthode :GetInfo()qui retourne une chaîne de caractères - Définir une structure
Caravec deux champs :Brand(string) etSpeed(int) - Implémenter la méthode
GetInfo()pour la structureCarqui retourne une chaîne de caractères au format :"Brand: [brand], Speed: [speed] km/h" - Analyser les entrées pour créer une instance de
Car - Appeler la méthode
GetInfo()et afficher le résultat
Rappelez-vous qu'en Go, la structure Car implémentera automatiquement l'interface Vehicle car elle possède la méthode GetInfo() requise avec la signature correcte. Il n'est pas nécessaire de déclarer explicitement que Car implémente Vehicle - Go reconnaît cette relation de manière implicite.
Aide-mémoire
Go utilise l'implémentation implicite pour les interfaces - aucun mot-clé ou déclaration spéciale n'est nécessaire.
Si un type possède toutes les méthodes requises par une interface, il satisfait automatiquement cette interface :
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Puisque Circle possède une méthode Area() qui retourne un float64, il implémente automatiquement l'interface Shaper sans déclaration explicite.
Cette approche implicite rend les interfaces Go flexibles - n'importe quel type existant peut satisfaire une nouvelle interface tant qu'il possède les méthodes requises, même si l'interface a été créée après le type.
Essayez vous-même
package main
import (
"fmt"
"strconv"
)
// TODO: 1. Définir l'interface Vehicle avec une méthode GetInfo() string
// TODO: 2. Définir la structure Car avec les champs Brand (string) et Speed (int)
// TODO: 3. Implémenter la méthode GetInfo() pour Car
func main() {
// Lire l'entrée
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// Convertir la chaîne de vitesse en entier
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. Créer une instance de Car en utilisant brand et speed, puis appeler GetInfo()
result := "" // remplacez cette ligne par votre implémentation
_ = brand
_ = speed
// Afficher le résultat
fmt.Println(result)
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportements