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:
Durch die Implementierung unterschiedlicher 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 einzelnen Do()-Methode für das ursprüngliche C-Objekt, die bei der Implementierung beider Logiken Schwierigkeiten bereiten würde.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3