package main
import (
"fmt"
)
type Animal struct{}
func (a *Animal) Escape() {
a.Run()
}
func (a *Animal) Run() {
fmt.Printf("Animal Run.\n")
}
type Dog struct {
Animal
}
func (d *Dog) Run() {
fmt.Printf("Dog Run.\n")
}
func main() {
dog := Dog{}
dog.Escape()
}
运行结果为:Animal Run.
但我想要的结果应该是:Dog Run.
这个要怎么实现?
我可能还是用的类的方式思考的,子类Dog继承了基类Animal ,并重写了Run方法。在子类中调用Escape时,Escape再调用Run时,应该也是调用的子类的Run。但是由于在Go语言中,在Dog调用Escape时,由于Dog并没有自己实现Escape而是继承的Animal 的方法,所以接收者是Animal ,再调用Run就是调用的Animal 的Run。
我要怎么才能在这种情况下调用到我重写后的Run呢?
有疑问加站长微信联系(非本文作者)

我记得反射的情况下,如果是一个结构实现了一个接口,可以用强制转换成接口在调用接口方法
这样的想法下,你的Dog也要实现一个Escape才可能实现吧。。。
结构体的内嵌规则问题,因为Dog结构体,没有对应的Escape方法,所以这里的
dog.Escape
等效于dog.Animal.Excape
方法抱歉题主,请忽略这一条
编程中难免遇到这种情况,就是有些方法可以继承父类的,有些又需要重写。但是继承自父类的方法就不能调用重写之后的方法,不知道有没有什么好的解决方法。
func main() {
}
//输出
//Dog Run.
//Animal Run.
ad.Escape(ad),调用自己的方法的时候,还要传入自己,感觉怪怪的。
go的采用组合的方式来实现继承。