Heim >Backend-Entwicklung >Golang >Wie gehe ich mit widersprüchlichen Methodensignaturen in mehreren Schnittstellen um?

Wie gehe ich mit widersprüchlichen Methodensignaturen in mehreren Schnittstellen um?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 21:50:30222Durchsuche

How to Handle Conflicting Method Signatures in Multiple Interfaces?

So implementieren Sie mehrere Schnittstellen mit identischen Methodensignaturen in verschiedenen Paketen

Angenommen, Sie müssen Schnittstellen implementieren, die in separaten Paketen mit widersprüchlichen Methodensignaturen definiert sind . Das kann eine Herausforderung sein, aber Go bietet eine Lösung.

Betrachten wir ein Beispiel:

  • In Paket A:

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

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

In Ihrem Hauptpaket:

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
}

Lösung:

Um diesen Konflikt zu lösen, bietet Go einen prägnanten Ansatz:

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

Damit können Sie überprüfen, ob ein Objekt (eines Schnittstellentyps) zur Laufzeit einem anderen Schnittstellentyp (z. B. A.Doer) entspricht.

Das OP weist jedoch auf eine weitere Komplikation hin: Die für Do() in Paket A und Paket B implementierte Logik ist unterschiedlich. Um dies zu beheben, erstellen Sie Wrapper um Ihr Objekt:

  • DoerA mit C als Feld und implementiert A.Do() logisch.
  • DoerB mit C als Feld und implementiert B. Do() logisch.

Durch die Implementierung verschiedener Wrapper können Sie basierend auf dem erwarteten Schnittstellentyp (A.Doer oder B.Doer) steuern, welche Methode verwendet werden soll. Dadurch entfällt die Notwendigkeit einer einzigen Do()-Methode für das ursprüngliche C-Objekt, die bei der Implementierung beider Logiken Schwierigkeiten bereiten würde.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit widersprüchlichen Methodensignaturen in mehreren Schnittstellen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn