Warum erfüllt eine konkrete Typimplementierung eine Schnittstellenmethode nicht, die eine Schnittstelle in Go zurückgibt?

DDD
Freigeben: 2024-10-26 22:48:03
Original
347 Leute haben es durchsucht

Why Doesn't a Concrete Type Implementation Satisfy an Interface Method Returning an Interface in Go?

Schnittstellenmethode, die eine Schnittstelleninkongruenz mit konkreter Typimplementierung zurückgibt

In Go stimmt eine Schnittstellenmethode, die eine Schnittstelle zurückgibt, nur mit einer Implementierung überein, die die Schnittstelle selbst deklariert, nicht mit einer konkreten Typ, der die Schnittstelle implementiert. Betrachten Sie das folgende Beispiel:

<code class="go">package main

import "fmt"

type Foo struct {
    val string
}

func (f *Foo) String() string {
    return f.val
}

type StringerGetter interface {
    GetStringer() fmt.Stringer
}

type Bar struct{}

func (b *Bar) GetStringer() *Foo {
    return &Foo{"foo"}
}

func Printer(s StringerGetter) {
    fmt.Println(s.GetStringer())
}

func main() {
    f := Bar{}
    Printer(&f) // compile-time error
}</code>
Nach dem Login kopieren

Dieser Code gibt den folgenden Fehler bei der Kompilierung aus:

cannot use &f (type *Bar) as type StringerGetter in argument to Printer:  *Bar does not implement StringerGetter (wrong type for GetStringer method)
Nach dem Login kopieren

Um dieses Problem zu beheben, sollte entweder die GetStringer-Methode im Bar-Typ einen fmt zurückgeben .Stringer-Schnittstelle anstelle eines konkreten *Foo-Typs, oder die StringerGetter-Schnittstelle sollte so geändert werden, dass sie einen konkreten Typ anstelle einer Schnittstelle akzeptiert.

Alternative Lösungen

In Fällen, in denen der externe konkrete Typ geändert wird oder die gemeinsame Schnittstelle nicht wünschenswert ist, gibt es zwei alternative Lösungen:

  1. Erstellen eines Wrapper-Typs: Sie können einen neuen Typ erstellen, der den externen konkreten Typ umhüllt und das Gewünschte implementiert Schnittstelle. Zum Beispiel:
<code class="go">type MyBar struct {
    Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
Nach dem Login kopieren
  1. Einbetten des Betontyps: Alternativ können Sie den externen Betontyp in Ihren eigenen Typ einbetten und die Schnittstelle mithilfe der eingebetteten Typen implementieren Methoden. Zum Beispiel:
<code class="go">type MyBar struct {
    embed Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.GetStringer()
}</code>
Nach dem Login kopieren

Beide Ansätze ermöglichen es Ihnen, mit dem externen konkreten Typ zu arbeiten und gleichzeitig die gewünschte Schnittstellenimplementierung bereitzustellen, ohne den ursprünglichen Typ oder die gemeinsam genutzte Schnittstelle zu ändern.

Das obige ist der detaillierte Inhalt vonWarum erfüllt eine konkrete Typimplementierung eine Schnittstellenmethode nicht, die eine Schnittstelle in Go zurückgibt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!