Sobes.tech
Junior

Qu'est-ce que la typification de canard?

sobes.tech IA

Réponse de l'IA

Le typage dynamique (duck typing) est un style de typage dynamique dans lequel le type d’un objet ou d’une variable est déterminé non pas en fonction de son héritage explicite ou de l’implémentation d’une interface, mais en fonction de la présence d’un ensemble spécifique de méthodes ou de propriétés. Si un objet "marche comme un canard et quack comme un canard", il est considéré comme un canard.

En Go, le typage de canard est implémenté via des interfaces implicites. La structure ou tout autre type de données n’a pas besoin d’indiquer explicitement qu’il implémente une interface spécifique. Il suffit que le type de données implémente toutes les méthodes définies dans l’interface.

Exemple :

package main

import "fmt"

// Définir l’interface Speaker
type Speaker interface {
	Speak()
}

// Définir la structure Dog
type Dog struct{}

// Dog implémente la méthode Speak()
func (d Dog) Speak() {
	fmt.Println("Woof!")
}

// Définir la structure Cat
type Cat struct{}

// Cat implémente la méthode Speak()
func (c Cat) Speak() {
	fmt.Println("Meow!")
}

// La fonction prend un argument de type Speaker
func MakeItSpeak(s Speaker) {
	s.Speak()
}

func main() {
	d := Dog{}
	c := Cat{}

	// Les deux objets, Dog et Cat, peuvent être passés à MakeItSpeak,
	// car ils implémentent tous deux implicitement Speaker.
	MakeItSpeak(d)
	MakeItSpeak(c)
}

Dans cet exemple, ni Dog ni Cat n’indiquent explicitement qu’ils implémentent Speaker. Cependant, comme ils ont tous deux la méthode Speak(), qui correspond à la signature de la méthode dans l’interface Speaker, ils peuvent être utilisés là où un Speaker est attendu.

Avantages du typage de canard en Go :

  • Flexibilité : Permet de créer facilement des systèmes modulaires et extensibles.
  • Absence de hiérarchie rigide : Il n’est pas nécessaire d’hériter ou d’implémenter explicitement des interfaces lors de la conception.
  • Facilité d’utilisation des types existants : Tout type ayant les méthodes nécessaires peut correspondre à l’interface, même s’il a été développé sans en tenir compte.