Go-Schnittstellenmethode, die die Schnittstelle zurückgibt, stimmt nicht mit der Methode überein, die den konkreten Typ zurückgibt
Problem:
Eine Schnittstellenmethode, die eine Schnittstelle zurückgibt, funktioniert nur, wenn der implementierende Typ die Schnittstelle selbst deklariert, nicht einen konkreten Typ, der die Schnittstelle implementiert.
Frage:
Wie können wir Dieses Problem lösen und gleichzeitig Änderungen an konkreten Typen von Drittanbietern oder direkte Schnittstellen zu diesen vermeiden?
Antwort:
Um die Schnittstelleninkongruenz auszugleichen, verwenden wir Kapselungstechniken:
1. Wrapper-Technik:
Erstellen Sie einen neuen Typ, der den konkreten Typ eines Drittanbieters umschließt und die gewünschte Schnittstelle bereitstellt:
<code class="go">type MyBar Bar func (b *MyBar) GetStringer() fmt.Stringer { return &Foo{"foo"} }</code>
Dieser Ansatz ermöglicht die Anpassung an die gewünschte Schnittstelle, ohne die zu beeinträchtigen Originalbetontyp.
2. Eingebettete Typtechnik:
Einbetten des Drittanbieter-Betontyps in einen neuen Typ und Bereitstellung der erforderlichen Schnittstellenimplementierung:
<code class="go">type MyBar struct{ Bar } func (b *MyBar) GetStringer() fmt.Stringer { return b.Bar.GetStringer() }</code>
Beim Einbetten bleibt die Funktionalität des ursprünglichen Betontyps erhalten Erweitern mit der gewünschten Schnittstelle.
Diese Techniken ermöglichen die Erstellung benutzerdefinierter Typen, die bestimmten Schnittstellen entsprechen, auch wenn dies bei den ursprünglichen konkreten Typen nicht der Fall ist. Sie bieten einen flexiblen Ansatz zur Integration von Drittanbietertypen in umfassendere schnittstellenbasierte Systeme.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit einer Schnittstelleninkongruenz um, wenn Schnittstellenmethoden mit konkreten Typen implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!