zoukankan      html  css  js  c++  java
  • Golang之继承模拟

    问题由一个需求引起:

    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的。

    感谢@hongqirui和@海意,在它们帮忙下找到了解决方法:

    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中要模拟普通的继承,除了使用嵌套之外,还需要在父类中“注册”子类的信息

    外友情帮忙推荐下@海意 所在公司的团队自产自销的web框架golanger。https://github.com/golangers

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    Docker容器监控
    Docker Compose集成式应用组合及service编排
    Docker数据挂载
    Docker 构建私有仓库
    Dockerfile构建私有镜像
    Docker常用命令
    【手记】Reflexil直接让方法返回true或false
    【组件分享】自定义窗口标题菜单
    DLL/OCX文件的注册与数据执行保护DEP
    【SQL】用SSMS连接Oracle手记
  • 原文地址:https://www.cnblogs.com/yjf512/p/2684133.html
Copyright © 2011-2022 走看看