How to convert an interface to another interface it implements?

PHPz
Release: 2024-02-13 20:45:08
forward
506 people have browsed it

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{} }
Copy after login

(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()
Copy after login

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
Copy after login

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()
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template