Maison  >  Article  >  développement back-end  >  Comment convertir une interface en une autre interface qu'elle implémente ?

Comment convertir une interface en une autre interface qu'elle implémente ?

PHPz
PHPzavant
2024-02-13 20:45:08502parcourir

Comment convertir une interface en une autre interface quelle 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.

Contenu de la question

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.

Solution

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()
}

Aire de jeux

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer