Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

PHPz
PHPznach vorne
2024-02-13 20:45:08456Durchsuche

Wie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?

php-Editor Strawberry zeigt Ihnen, wie Sie eine Schnittstelle in eine andere von ihr implementierte Schnittstelle umwandeln. In der Programmierung ist eine Schnittstelle ein abstrakter Typ, der eine Reihe von Methoden definiert, während eine andere Schnittstelle ein konkreter Typ ist, der diese Methoden implementiert. Durch die Konvertierung einer Schnittstelle in eine andere können wir bestehende Funktionen erweitern, ohne den ursprünglichen Code zu ändern. In diesem Artikel wird dieser Prozess ausführlich erläutert und Beispieldemonstrationen bereitgestellt, um den Lesern zu helfen, diese Technik besser zu verstehen und anzuwenden.

Frageninhalt

Kurz gesagt – Ich möchte in der Lage sein, einen Schnittstellentyp, dessen zugrunde liegender Typ eine bestimmte Schnittstelle implementiert, in diese bestimmte Schnittstelle umzuwandeln.

Ich verwende das Plugin-Paket, um eine neue Funktion zu finden, und sie sieht folgendermaßen aus (ich habe viele andere identische Funktionen):

func newdomainprimarykey() any { return domainprimarykey{} }

(Dies wird zur Laufzeit generiert, daher kann ich es nicht einfach als Domänenprimärschlüssel referenzieren)

Meine Suche und mein Anruf sehen so aus:

                plugin, err := plugin.open("my-plugin")
                if err != nil {
                    return err
                }

                symget, err := plugin.lookup("new" + pluginname)
                if err != nil {
                    return err
                }

                newgenmodel, ok := symget.(func() any)
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                anygenmodel := newgenmodel()
                genmodel, ok := anygenmodel.(genmodel) // **this is where the problem is
                if !ok {
                    return errors.new("unexpected type from module symbol")
                }

                genmodelinstance := genmodel.get()

Oben habe ich versucht, „anygenmodel“ (eine Schnittstelle) in die von ihr implementierte „genmodel“-Schnittstelle zu konvertieren, aber das funktioniert nicht.

Ich bin sicher, dass diese Schnittstelle implementiert wird, denn wenn ich Folgendes mache, erhalte ich keine Fehler.

type GenModel interface {
    Get() any
    TableName() string
}

var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain

Was soll ich tun? Ich habe diesen Artikel gefunden, der nicht das ist, wonach ich suche, der aber ähnlich aussieht.

Vielen Dank im Voraus für jede Hilfe – das ist für mich zu einer echten Hürde geworden.

Workaround

Wenn der zugrunde liegende Typ diese beiden Schnittstellen implementiert, ist es ganz einfach:

package main

import "fmt"

type IFace1 interface {
    DoThis()
}

type IFace2 interface {
    DoThat()
}

type impl struct{}

func (i *impl) DoThis() {
    fmt.Println("I implement IFace1")
}

func (i *impl) DoThat() {
    fmt.Println("I implement IFace2")
}

func GetIFace1() IFace1 {
    return &impl{}
}

func main() {
    i1 := GetIFace1()

    i1.DoThis()

    i2 := i1.(IFace2)

    i2.DoThat()
}

Spielplatz

Wenn Ihr Code nicht funktioniert, würde ich zunächst Ihre Behauptung in Frage stellen, nämlich anygenmodel 的底层类型实际上实现了 genmodel, und von dort aus arbeiten.

Das obige ist der detaillierte Inhalt vonWie konvertiert man eine Schnittstelle in eine andere, von ihr implementierte Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen