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

PHPz
Lepaskan: 2024-02-13 20:45:08
ke hadapan
474 orang telah melayarinya

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{} }
Salin selepas log masuk

(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()
Salin selepas log masuk

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
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!