Maison > développement back-end > Golang > Comment gérer les signatures de méthodes conflictuelles dans plusieurs interfaces ?

Comment gérer les signatures de méthodes conflictuelles dans plusieurs interfaces ?

Linda Hamilton
Libérer: 2024-11-02 21:50:30
original
273 Les gens l'ont consulté

How to Handle Conflicting Method Signatures in Multiple Interfaces?

Comment implémenter plusieurs interfaces avec des signatures de méthode identiques dans différents packages

Supposons que vous deviez implémenter des interfaces définies dans des packages distincts avec des signatures de méthode contradictoires . Cela peut être difficile, mais Go propose une solution.

Prenons un exemple :

  • Dans le package A :

    package A
    
    type Doer interface {
      Do() string
    }
    
    func FuncA(doer A.Doer) {
      // Use doer.Do() here to implement functionality
    }
    Copier après la connexion
  • Dans le package B :

    package B
    
    type Doer interface {
      Do() string
    }
    
    func FuncB(doer B.Doer) {
      // Use doer.Do() here to implement functionality
    }
    Copier après la connexion

Dans votre principal package :

package main

import (
    "path/to/A"
    "path/to/B"
)

type C int

// C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A.
func (c C) Do() string {
    return "C implements both A and B"
}

func main() {
    c := C(0)
    A.FuncA(c) // Acceptable as C implements A.Doer
    B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements
}
Copier après la connexion

Solution :

Pour résoudre ce conflit, Go propose une approche concise :

if _, ok := obj.(A.Doer); ok {
}
Copier après la connexion

Cela vous permet de vérifier si un objet (d'un type d'interface) est conforme à un autre type d'interface (par exemple, A.Doer) à runtime.

Cependant, l'OP met en évidence une complication supplémentaire : la logique implémentée pour Do() dans le package A et le package B est distincte. Pour résoudre ce problème, créez des wrappers autour de votre objet :

  • DoerA avec C comme champ, implémentant A.Do() logiquement.
  • DoerB avec C comme champ, implémentant B. Do() logiquement.

En implémentant des wrappers distincts, vous pouvez contrôler la méthode à utiliser en fonction du type d'interface attendu (A.Doer ou B. Doer). Cela élimine le besoin d'une seule méthode Do() sur l'objet C d'origine, qui aurait du mal à implémenter les deux logiques.

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