"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar firmas de métodos en conflicto en múltiples interfaces?

¿Cómo manejar firmas de métodos en conflicto en múltiples interfaces?

Publicado el 2024-12-21
Navegar:172

How to Handle Conflicting Method Signatures in Multiple Interfaces?

Cómo implementar múltiples interfaces con firmas de métodos idénticas en diferentes paquetes

Supongamos que necesita implementar interfaces definidas en paquetes separados con firmas de métodos en conflicto . Esto puede ser un desafío, pero Go proporciona una solución.

Consideremos un ejemplo:

  • En el paquete A:

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

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

En su paquete 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
}

Solución:

Para resolver este conflicto, Go ofrece un enfoque conciso:

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

Esto le permite verificar si un objeto (de un tipo de interfaz) se ajusta a otro tipo de interfaz (por ejemplo, A.Doer) en tiempo de ejecución.

Sin embargo, el OP destaca una complicación adicional : la lógica implementada para Do() en el Paquete A y el Paquete B es distinta. Para solucionar esto, cree envoltorios alrededor de su objeto:

  • DoerA con C como campo, implementando A.Do() lógicamente.
  • DoerB con C como campo, implementando B. Do() lógicamente.

Al implementar contenedores distintos, puede controlar qué método usar según el tipo de interfaz esperado (A.Doer o B.Doer). Esto elimina la necesidad de un único método Do() en el objeto C original, que tendría dificultades para implementar ambas lógicas.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3