"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar com assinaturas de métodos conflitantes em múltiplas interfaces?

Como lidar com assinaturas de métodos conflitantes em múltiplas interfaces?

Publicado em 2024-12-21
Navegar:953

How to Handle Conflicting Method Signatures in Multiple Interfaces?

Como implementar múltiplas interfaces com assinaturas de métodos idênticos em pacotes diferentes

Suponha que você precise implementar interfaces definidas em pacotes separados com assinaturas de métodos conflitantes . Isso pode ser desafiador, mas Go oferece uma solução.

Vamos considerar um exemplo:

  • No pacote A:

    package A
    
    type Doer interface {
      Do() string
    }
    
    func FuncA(doer A.Doer) {
      // Use doer.Do() here to implement functionality
    }
  • No pacote B:

    package B
    
    type Doer interface {
      Do() string
    }
    
    func FuncB(doer B.Doer) {
      // Use doer.Do() here to implement functionality
    }

Em seu pacote principal:

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
}

Solução:

Para resolver esse conflito, Go oferece uma abordagem concisa:

if _, ok := obj.(A.Doer); ok {
}

Isso permite verificar se um objeto (de um tipo de interface) está em conformidade com outro tipo de interface (por exemplo, A.Doer) em tempo de execução.

No entanto, o OP destaca uma complicação adicional : a lógica implementada para Do() no Pacote A e no Pacote B é distinta. Para resolver isso, crie wrappers em torno do seu objeto:

  • DoerA com C como campo, implementando A.Do() logicamente.
  • DoerB com C como campo, implementando B. Do() logicamente.

Ao implementar wrappers distintos, você pode controlar qual método usar com base no tipo de interface esperado (A.Doer ou B.Doer). Isso elimina a necessidade de um único método Do() no objeto C original, que teria dificuldades para implementar ambas as lógicas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3