Maison > Article > développement back-end > Comment convertir une interface en une autre interface qu'elle implémente ?
l'éditeur php Strawberry vous présentera comment convertir une interface en une autre interface qu'il implémente. En programmation, une interface est un type abstrait qui définit un ensemble de méthodes, tandis qu'une autre interface est un type concret qui implémente ces méthodes. La conversion d'une interface en une autre interface peut nous aider à étendre les fonctionnalités existantes sans modifier le code d'origine. Cet article expliquera ce processus en détail et fournira des exemples pratiques pour aider les lecteurs à mieux comprendre et appliquer cette technique.
En bref - Je veux pouvoir convertir un type d'interface dont le type sous-jacent implémente une interface spécifique vers cette interface spécifique.
J'utilise le package plugin pour trouver une nouvelle fonction et cela ressemble à ceci (j'ai plein d'autres fonctions identiques) :
func newdomainprimarykey() any { return domainprimarykey{} }
(Ceci est généré au moment de l'exécution, je ne peux donc pas simplement le référencer en tant que domainprimarykey)
Ma recherche et mon appel ressemblent à ceci :
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()
Ci-dessus, j'ai essayé de convertir "anygenmodel" (une interface) en interface "genmodel" qu'il implémente, cependant, cela ne fonctionne pas.
Je suis sûr qu'il implémente cette interface car lorsque je fais ce qui suit, je n'obtiens aucune erreur.
type GenModel interface { Get() any TableName() string } var _ GenModel = (*DomainPrimaryKey)(nil) // this doesn't complain
Que dois-je faire ? J'ai trouvé cet article qui n'est pas ce que je recherche mais qui y ressemble.
Merci d'avance pour toute aide - c'est devenu un véritable obstacle pour moi.
Si le type sous-jacent implémente ces deux interfaces, c'est très simple :
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() }
Si votre code ne fonctionne pas, je remettrais d'abord en question votre affirmation, qui est anygenmodel
的底层类型实际上实现了 genmodel
, et je travaillerais à partir de là.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!