Golang之继承模拟
2016-04-07 13:39
381 查看
问题由一个需求引起:
如何解决呢? – 用继承
用继承的观点看没错,实际运行呢?
分析问题,首先这里“继承”两个词就用错了,在go中不应该提及“继承”这个词,我更选择使用“嵌套”这个词。
在父类中加一个
web的
controller,希望创建一个基类,然后在子类的
controller中定义
action方法,基类有一个
run函数能根据字符串自动找到子类的
action方法。
如何解决呢? – 用继承
示例分析继承
首先这个需求是很普遍的,由于脑中有继承概念,所以想当然地以为这个很容易实现:package main import( "reflect" ) type A struct { } func (self A)Run() { c := reflect.ValueOf(self) method := c.MethodByName("Test") println(method.IsValid()) } type B struct { A } func (self B)Test(s string){ println("b") } func main() { b := new(B) b.Run() }
B继承
A,
B中调用
Run方法,自然会调用到
A的
Run方法,然后我根据string“Test”,希望能找到
B中(
B是子类)的
Test方法。
用继承的观点看没错,实际运行呢?
method.IsValid()返回
false。很明显,这里的
Test方法是找不到的。
分析问题,首先这里“继承”两个词就用错了,在go中不应该提及“继承”这个词,我更选择使用“嵌套”这个词。
B是嵌套了
A,所以这里的
b.Run()实际上是语法糖,调用的是
b.A.Run()。这里
Run的全部环境都在
A中。所以是找不到
A的
Test的。
package main import( "reflect" ) type A struct { Parent interface{} } func (self A)Run() { c := reflect.ValueOf(self.Parent) method := c.MethodByName("Test") println(method.IsValid()) } type B struct { A } func (self B)Test(s string){ println("b") } func (self B)Run(){ self.A.Run() } func main() { b := new(B) b.A.Parent = b b.Run() }
在父类中加一个
interface{}记录子类!!这样问题就迎刃而解了!
method.IsValid()返回了
true。
结论
所以在golang中要模拟普通的继承,除了使用嵌套之外,还需要在父类中“注册”子类的信息!相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记