類似于Java中的繼承,子類繼承并重寫父類的方法,Go語(yǔ)言也提供了這樣的實(shí)現(xiàn)。
Go語(yǔ)言中可以創(chuàng)建一個(gè)或者多個(gè)類型作為嵌入字段的自定義結(jié)構(gòu)體,任何嵌入類型中的方法都可以當(dāng)作該自定義結(jié)構(gòu)體自身的方法被調(diào)用,從而間接實(shí)現(xiàn)子類繼承父類的方式
在Go語(yǔ)言中,如果“子類”重寫了“父類”的成員方法,需要在子類的成員方法中調(diào)用基類的同名成員方法,一定要以
子類名.父類名.重寫方法名
這樣顯式的方法調(diào)用,而不是使用
子類名.重寫方法名
這種調(diào)用繼承方法的方式調(diào)用,這樣會(huì)出現(xiàn)無(wú)限循環(huán),即一直在調(diào)用子類的方法。
我們來(lái)看一個(gè)代碼示例
//創(chuàng)建一個(gè)Birds類
type Birds struct {
Name string //具名字段(聚合)
}
//Birds類有三個(gè)方法
func (bird *Birds)HasFoot() {
fmt.Println(bird.Name," has feet!")
}
func (bird *Birds)HasEye() {
fmt.Println(bird.Name," has eye!")
}
func (bird *Birds)HasFlying() {
fmt.Println(bird.Name," can flying!")
}
//創(chuàng)建一個(gè)Ostrich類,并繼承 Birds
type Ostrich struct {
Birds //匿名字段(嵌入)
Wings string //具名字段(聚合)
}
//重寫B(tài)ase的Flying方法
func (ostrich *Ostrich)HasFlying() {
ostrich.Birds.HasFoot() //顯示調(diào)用父類Birds的方法
ostrich.Birds.HasEye() //顯示調(diào)用父類Birds的方法
ostrich.HasFoot() //隱式調(diào)用父類Birds的方法
ostrich.HasEye() //隱式調(diào)用父類Birds的方法
fmt.Println(ostrich.Name," can`t fly")
}
func main() {
ostrich := new(Ostrich)
ostrich.Name = "鴕鳥"
ostrich.HasFlying() //調(diào)用子類的方法
}
下面會(huì)無(wú)限調(diào)用自己,形成死循環(huán)
func (ostrich *Ostrich)HasFlying() {
ostrich.HasFlying() // 無(wú)限調(diào)用自己
fmt.Println(ostrich.Name," can`t fly") // 永遠(yuǎn)不會(huì)執(zhí)行到這里
}