Home  >  Article  >  Backend Development  >  How to convert an interface to another interface it implements?

How to convert an interface to another interface it implements?

PHPz
PHPzforward
2024-02-13 20:45:08454browse

How to convert an interface to another interface it implements?

php editor Strawberry will introduce how to convert an interface into another interface it implements. In programming, an interface is an abstract type that defines a set of methods, while another interface is a concrete type that implements these methods. Converting an interface to another interface can help us extend existing functionality without changing the original code. This article will explain this process in detail and provide example demonstrations to help readers better understand and apply this technique.

Question content

In short - I want to be able to convert an interface type whose underlying type implements a specific interface to that specific interface.

I'm using the plugin package to find a new function and it looks like this (I have a lot of other identical functions):

func newdomainprimarykey() any { return domainprimarykey{} }

(This is generated at runtime so I can't just reference it as domainprimarykey)

My lookup and call looks like this:

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

Above, I tried converting "anygenmodel" (an interface) to the "genmodel" interface it implements, however, this does not work.

I'm sure it implements this interface because when I do the following, I don't get any errors.

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

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

what should I do? I found this article which is not what I'm looking for but looks similar.

Thanks in advance for any help with this - this has become a real roadblock for me.

Solution

If the underlying type implements these two interfaces, it is very 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()
}

Playground

If your code doesn't work, then I would first question your assertion that the underlying type of anygenmodel actually implements genmodel and work from there.

The above is the detailed content of How to convert an interface to another interface it implements?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete