Dans Go, lorsque vous traitez plusieurs interfaces avec la même signature de méthode mais définies dans des packages distincts, des situations peuvent survenir où un type implémentant les deux interfaces conduit à un comportement inattendu.
Considérez ces deux interfaces (Doer) et fonctions (FuncA et FuncB) définies dans différents packages :
// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)
// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)
Si un type C implémente Doer à partir des deux packages et que l'implémentation diffère :
// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }
func main() {
cA := C(0); A.FuncA(cA)
cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}
Pour résoudre ce problème, le système de types de Go met l'accent sur la correspondance par nom et la cohérence des types. Bien qu'elle permette à un objet de satisfaire plusieurs interfaces, l'implémentation de la méthode partagée doit respecter tous les contrats d'interface applicables.
Dans le scénario ci-dessus, une solution de contournement implique l'implémentation de types de wrapper :
// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }
func main() {
cA := DoerA{C(0)}; A.FuncA(cA)
cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}
En créant ces wrappers, vous pouvez contrôler l'implémentation de Do() en fonction de l'utilisation prévue de l'interface, garantissant ainsi la cohérence dans les contextes de package respectifs.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3