Rumah > Artikel > pembangunan bahagian belakang > 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.
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.
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() }
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!