父类:
1. 把要重载的方法用函数式参数存起来(充当虚表)
2. 调用方法从虚表查找实现, 没有的话就给个默认实现
3. 调用实现方法
子类:
1. 继承父类方法
2. 新增一个构造函数, 用于修改虚表, 覆盖父类实现
3. 创建对象并调用构造函数, 就可以愉快地玩耍了
package extension
import (
"fmt"
"testing"
)
type Pet struct {
speakHandle func()
speakToHandle func(string)
}
func (p *Pet) Speak() {
if p.speakHandle == nil {
p.speakHandle = func() {
fmt.Print("...")
}
}
p.speakHandle()
}
func (p *Pet) SpeakTo(host string) {
if p.speakToHandle == nil {
p.speakToHandle = func(_host string) {
p.Speak()
fmt.Println(_host)
}
}
p.speakToHandle(host)
}
type Dog struct {
Pet
}
func (d *Dog) Ctor() *Dog {
overrideSpeakHandle(d)
//overrideSpeakToHandle(d)
return d
}
func overrideSpeakHandle(d *Dog) {
if d.speakHandle == nil {
d.speakHandle = func() {
fmt.Print("Wang!")
}
}
}
func overrideSpeakToHandle(d *Dog) {
if d.speakToHandle == nil {
d.speakToHandle = func(_host string) {
d.Speak()
fmt.Println(_host + "...")
}
}
}
func TestDog(t *testing.T) {
pet := Pet{}
dog := new(Dog).Ctor()
pet.SpeakTo("Xu")
dog.SpeakTo("Xu")
}
展开