```go
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呢?
```go
package main
import "fmt"
type IAnimal interface {
Run()
}
type Animal struct{}
func (a *Animal) Escape(ianimal IAnimal) {
ianimal.Run()
}
func (a *Animal) Run() {
fmt.Printf("Animal Run.\n")
}
type Dog struct {
s Animal
}
func (d *Dog) Run() {
fmt.Printf("Dog Run.\n")
}
func main() {
dog := &Dog{}
dog.s.Escape(dog)
ad:=&Animal{}
ad.Escape(ad)
}
```
//输出
//Dog Run.
//Animal Run.
#8
更多评论