人妻丰满熟妇AV无码片,岛国AV无码免费无禁网站,丰满岳乱妇一区二区三区,男插女高潮一区二区

golang 的繼承 其實(shí)是嵌套

技術(shù)分享 2019-10-01 00:00:00
package main

import(
"reflect"
)

type A struct {
}


func (self A)Run() {
c := reflect.ValueOf(self)
method := c.MethodByName("Test")
println(method.IsValid())
}

type B struct {
A
}

func (self B)Test(s string){
println("b")
}

func main() {
b := new(B)
b.Run()
}

B繼承A,B中調(diào)用Run方法,自然會調(diào)用到A的Run方法,然后我根據(jù)string“Test”,希望能找到B中(B是子類)的Test方法。

用繼承的觀點(diǎn)看沒錯(cuò),實(shí)際運(yùn)行呢?method.IsValid() 返回false。很明顯,這里的Test方法是找不到的。

分析問題,首先這里“繼承”兩個(gè)詞就用錯(cuò)了,在go中不應(yīng)該提及“繼承”這個(gè)詞,我更選擇使用“嵌套”這個(gè)詞。B是嵌套了A,所以這里的b.Run()實(shí)際上是語法糖,調(diào)用的是b.A.Run()。這里Run的全部環(huán)境都在A中。所以是找不到A的Test的。

幫忙下找到了解決方法:

package main

import(
"reflect"
)

type A struct {
Parent interface{}
}


func (self A)Run() {
c := reflect.ValueOf(self.Parent)
method := c.MethodByName("Test")
println(method.IsValid())
}

type B struct {
A
}

func (self B)Test(s string){
println("b")
}

func (self B)Run(){
self.A.Run()
}


func main() {
b := new(B)
b.A.Parent = b
b.Run()

}



在父類中加一個(gè)interface{}記錄子類!!這樣問題就迎刃而解了!method.IsValid()返回了true。






結(jié)論


所以在golang中要模擬普通的繼承,除了使用嵌套之外,還需要在父類中“注冊”子類的信息!
咨詢小瓶科技
咨詢我們
頂部