Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menukar antara muka kepada antara muka lain yang dilaksanakannya?

Bagaimana untuk menukar antara muka kepada antara muka lain yang dilaksanakannya?

PHPz
PHPzke hadapan
2024-02-13 20:45:08498semak imbas

Bagaimana untuk menukar antara muka kepada antara muka lain yang dilaksanakannya?

editor php Strawberry akan memperkenalkan kepada anda cara menukar antara muka kepada antara muka lain yang dilaksanakannya. Dalam pengaturcaraan, antara muka ialah jenis abstrak yang mentakrifkan satu set kaedah, manakala antara muka lain ialah jenis konkrit yang melaksanakan kaedah ini. Menukar antara muka kepada antara muka lain boleh membantu kami melanjutkan fungsi sedia ada tanpa mengubah kod asal. Artikel ini akan menerangkan proses ini secara terperinci dan menyediakan contoh demonstrasi untuk membantu pembaca memahami dan menggunakan teknik ini dengan lebih baik.

Kandungan soalan

Ringkasnya - Saya mahu dapat menukar jenis antara muka yang jenis asasnya melaksanakan antara muka khusus kepada antara muka khusus itu.

Saya menggunakan pakej pemalam untuk mencari fungsi baharu dan ia kelihatan seperti ini (saya mempunyai banyak fungsi lain yang serupa):

func newdomainprimarykey() any { return domainprimarykey{} }

(Ini dijana semasa runtime jadi saya tidak boleh merujuknya sebagai domainprimarykey sahaja)

Pencarian dan panggilan saya kelihatan seperti ini:

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

Di atas, saya cuba menukar "anygenmodel" (antara muka) kepada antara muka "genmodel" yang dilaksanakannya, namun, ini tidak berfungsi.

Saya pasti ia melaksanakan antara muka ini kerana apabila saya melakukan perkara berikut, saya tidak mendapat sebarang ralat.

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

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

Apa yang perlu saya lakukan? Saya menjumpai artikel ini yang bukan yang saya cari tetapi kelihatan serupa.

Terima kasih terlebih dahulu untuk sebarang bantuan dengan ini - ini telah menjadi penghalang jalan sebenar bagi saya.

Penyelesaian

Jika jenis asas melaksanakan kedua-dua antara muka ini, ia sangat mudah:

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

Taman permainan

Jika kod anda tidak berfungsi, maka saya mula-mula akan mempersoalkan pernyataan anda, iaitu anygenmodel 的底层类型实际上实现了 genmodel dan berfungsi dari situ.

Atas ialah kandungan terperinci Bagaimana untuk menukar antara muka kepada antara muka lain yang dilaksanakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam