類似于Java中的繼承卵皂,子類繼承并重寫父類的方法,Go語言也提供了這樣的實現(xiàn)逝撬。
Go語言中可以創(chuàng)建一個或者多個類型作為嵌入字段的自定義結(jié)構(gòu)體戴质,任何嵌入類型中的方法都可以當(dāng)作該自定義結(jié)構(gòu)體自身的方法被調(diào)用,從而間接實現(xiàn)子類繼承父類的方式
在Go語言中式撼,如果“子類”重寫了“父類”的成員方法童社,需要在子類的成員方法中調(diào)用基類的同名成員方法,一定要以
子類名.父類名.重寫方法名
這樣顯式的方法調(diào)用著隆,而不是使用
子類名.重寫方法名
這種調(diào)用繼承方法的方式調(diào)用扰楼,這樣會出現(xiàn)無限循環(huán),即一直在調(diào)用子類的方法美浦。
我們來看一個代碼示例
//創(chuàng)建一個Birds類
type Birds struct {
Name string //具名字段(聚合)
}
//Birds類有三個方法
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)建一個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)用子類的方法
}
下面會無限調(diào)用自己,形成死循環(huán)
func (ostrich *Ostrich)HasFlying() {
ostrich.HasFlying() // 無限調(diào)用自己
fmt.Println(ostrich.Name," can`t fly") // 永遠不會執(zhí)行到這里
}