Maison > développement back-end > Golang > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-02 22:12:30
original
695 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!