Maison  >  Article  >  développement back-end  >  Comment implémenter plusieurs interfaces avec des signatures de méthode identiques dans Go ?

Comment implémenter plusieurs interfaces avec des signatures de méthode identiques dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 22:12:30779parcourir

How to Implement Multiple Interfaces with Identical Method Signatures in Go?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn