```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"
"reflect"
)
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 {
Animal
}
func (d *Dog) Run() {
fmt.Printf("Dog Run.\n")
}
```
func main() {
dog := &Dog{}
dogv:=reflect.ValueOf(dog)
dogt:=reflect.Indirect(dogv).Type()
dognew:=reflect.New(dogt)
dogi:=dognew.Interface().(IAnimal)
dog.Escape(dogi)
}
#7
更多评论