Polymorphisme en Go : existe-t-il ?
Le polymorphisme, la capacité pour des objets de classes différentes d'avoir des méthodes identiques, est un aspect fondamental de programmation orientée objet. Dans Go, cependant, les méthodes de définition des interfaces semblent indisponibles.
Examinons un exemple de base :
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data } func (this MyStruct) Set(i int) { this.data = i }
Lorsque ce code est exécuté, la méthode Set pour le type MyStruct échoue car le récepteur n'est pas un pointeur. Toutes les modifications apportées à ce paramètre sont perdues à la fermeture de la fonction.
On pourrait tenter de résoudre ce problème en changeant le récepteur en pointeur :
func (this *MyStruct) Set(i int) { this.data = i }
Cependant, cela entraînerait une erreur de compilation . Les méthodes d'interface dans Go ne peuvent pas avoir de récepteurs de pointeurs.
Alors, existe-t-il un moyen d'obtenir un polymorphisme dans ce scénario ?
L'alternative la plus proche est d'utiliser un type d'interface et une structure anonyme qui implémente l'interface :
type MyInterfacer interface { Get() int Set(i int) } var mi MyInterfacer = &MyStruct{123} fmt.Println(mi.Get()) // prints 123 mi.Set(456) fmt.Println(mi.Get()) // prints 456
Bien que cette solution ne soit pas un vrai polymorphisme, elle utilise une interface pour fournir un environnement propre et flexible façon de manipuler des objets de différents types.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!