类似于Java中的继承,子类继承并重写父类的方法,Go语言也提供了这样的实现。
Go语言中可以创建一个或者多个类型作为嵌入字段的自定义结构体,任何嵌入类型中的方法都可以当作该自定义结构体自身的方法被调用,从而间接实现子类继承父类的方式
在Go语言中,如果“子类”重写了“父类”的成员方法,需要在子类的成员方法中调用基类的同名成员方法,一定要以
子类名.父类名.重写方法名
这样显式的方法调用,而不是使用
子类名.重写方法名
这种调用继承方法的方式调用,这样会出现无限循环,即一直在调用子类的方法。
我们来看一个代码示例
//创建一个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!")
}
//创建一个Ostrich类,并继承 Birds
type Ostrich struct {
Birds //匿名字段(嵌入)
Wings string //具名字段(聚合)
}
//重写Base的Flying方法
func (ostrich *Ostrich)HasFlying() {
ostrich.Birds.HasFoot() //显示调用父类Birds的方法
ostrich.Birds.HasEye() //显示调用父类Birds的方法
ostrich.HasFoot() //隐式调用父类Birds的方法
ostrich.HasEye() //隐式调用父类Birds的方法
fmt.Println(ostrich.Name," can`t fly")
}
func main() {
ostrich := new(Ostrich)
ostrich.Name = "鸵鸟"
ostrich.HasFlying() //调用子类的方法
}
下面会无限调用自己,形成死循环
func (ostrich *Ostrich)HasFlying() {
ostrich.HasFlying() // 无限调用自己
fmt.Println(ostrich.Name," can`t fly") // 永远不会执行到这里
}