分享
golang 父类调用子类方法、继承多态的实现方式
liyiyang · · 8839 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
实现思路: 父类方法接收子类对象,通过反射调用子类方法
直接上代码:
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
b.sayReal(b) //I'm A
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信8839 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
实现思路: 父类方法接收子类对象,通过反射调用子类方法
直接上代码:
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
b.sayReal(b) //I'm A
}