```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的采用组合的方式来实现继承。
```go
package main
import (
"fmt"
)
type IAnimal interface {
Run()
Escape()
}
type Animal struct{
Name string
}
func NewAnimal() IAnimal{
return &Animal{"Animal"}
}
func (a *Animal) Escape() {
a.Run()
}
func (a *Animal) Run() {
fmt.Printf("%s Run.\n", a.Name)
}
type Dog struct {
Animal
}
func NewDog() IAnimal{
d := &Dog{}
d.Name = "Dog"
return d
}
func main() {
dog := NewDog()
dog.Run()
dog.Escape()
}
```
#11
更多评论