golang 父类调用子类方法、继承多态的实现方式
实现思路
go 语言中,当子类调用父类方法时,“作用域”将进入父类的作用域,看不见子类的方法存在(个人想象的)
我们可以通过参数将子类传递给父类,实现在父类中调用子类方法。
实现方式有两种:
一、 基于接口
定义接口,父子类都实现接口,父类方法接收接口类型参数
特点:
- 结构简单,思路清晰。
- 基于接口,轻松应对多级继承的情况。
直接上代码:
package main
import (
"fmt"
)
type Name interface {
Name() string
}
type A struct {
}
func (self A) say() {
println(self.Name())
}
func (self A) sayReal(child Name) {
fmt.Println(child.Name())
}
func (self A) Name() string {
return "I'm A"
}
type B struct {
A
}
func (self B) Name() string {
return "I'm B"
}
type C struct {
A
}
func main() {
b := B{}
b.say() //I'm A
b.sayReal(b) //I'm B
c := C{}
c.say() //I'm A
c.sayReal(c) //I'm A
}二、 基于反射
父类方法接收子类对象,通过反射调用子类方法
直接上代码:
package main
import (
"fmt"
"reflect"
)
type A struct {
}
func (self A) say() {
println(self.Name())
}
func (self A) sayReal(child interface{}) {
ref := reflect.ValueOf(child)
method := ref.MethodByName("Name")
if (method.IsValid()) {
r := method.Call(make([]reflect.Value, 0))
fmt.Println(r[0].String())
} else {
// 错误处理
}
}
func (self A) Name() string {
return "I'm A"
}
type B struct {
A
}
func (self B) Name() string {
return "I'm B"
}
type C struct {
A
}
func main() {
b := B{}
b.say() //I'm A
b.sayReal(b) //I'm B
c := C{}
c.say() //I'm A
c.sayReal(c) //I'm A
} 相关推荐
lynjay 2020-06-06
jameszgw 2020-06-03
Greatemperor 2020-05-17
HongKongPython 2020-05-12
宿舍 2020-05-06
Darklovy 2020-04-29
austindev 2020-04-25
sunnyJam 2020-04-15
fly00love 2020-03-08
ladysosoli 2020-03-01
llwang0 2020-02-29
TreasureZ 2020-02-22
jacktangj 2020-02-19
明天你好 2020-02-18
katyusha 2020-02-16
wangqing 2020-02-13
vanturman 2020-02-10
Winterto0 2020-01-28