Implémentation de plusieurs interfaces avec des signatures de méthode identiques
Dans Go, les interfaces offrent une sécurité de type et prennent en charge l'héritage multiple. Cependant, lorsque deux interfaces définies dans des packages différents partagent la même signature de méthode, l'implémentation des deux avec une seule implémentation peut entraîner des incohérences.
Pour résoudre ce problème, le langage de programmation Go impose la cohérence des types de méthodes lors de l'implémentation des interfaces. Cela garantit la clarté et réduit la confusion potentielle.
Dans le scénario fourni, vous souhaitez implémenter les deux interfaces, A.Doer et B.Doer, en utilisant la même méthode C.Do. Bien que C.Do satisfasse aux exigences de A.Doer, il peut ne pas adhérer à la logique attendue par B.Doer.
Une solution consiste à utiliser des assertions de type. En vérifiant si un objet satisfait à la fois A.Doer et B.Doer, vous pouvez déterminer quelle implémentation utiliser.
<code class="go">if _, ok := obj.(A.Doer); ok { // Use A.Doer implementation } if _, ok := obj.(B.Doer); ok { // Use B.Doer implementation }</code>
Cependant, si la logique de A.Do et B.Do diffère considérablement, un plus Une approche robuste consiste à créer des wrappers séparés pour l'objet.
Créez deux nouveaux types, DoerA et DoerB, chacun contenant l'objet C et implémentant respectivement A.Doer ou B.Doer. En passant le wrapper approprié à la fonction correspondante, vous pouvez vous assurer que la logique attendue est implémentée.
<code class="go">type DoerA struct { C C } // Implement A.Do() using C.Do() func (d DoerA) Do() string { return "C now implements A as per its logic" } type DoerB struct { C C } // Implement B.Do() using C.Do() func (d DoerB) Do() string { return "C now implements B as per its logic" } func main() { c := C(0) dA := DoerA{C: c} dB := DoerB{C: c} A.FuncA(dA) B.FuncB(dB) }</code>
En utilisant des wrappers séparés, vous pouvez appliquer l'implémentation correcte pour chaque méthode d'interface tout en utilisant le C sous-jacent. objet.
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!