Golang之继承模拟

问题由一个需求引起:

web的controller,希望创建一个基类,然后在子类的controller中定义action方法,基类有一个run函数能根据字符串自动找到子类的action方法。

 

如何解决呢? -- 用继承

示例分析继承

首先这个需求是很普遍的,由于脑中有继承概念,所以想当然地以为这个很容易实现:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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和@海意,在它们帮忙下找到了解决方法:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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

时间: 2024-12-11 15:48:31

Golang之继承模拟的相关文章

类模拟及多态、继承

在面向对象的语言里面,出现了类的概念.这是编程思想的一种进化.所谓类:是对特定数据的特定操作的集合体.所以说类包含了两个范畴:数据和操作.而C语言中的suct仅仅是数据的集合.(liyuming1978@163.com) 1.实例:下面先从一个小例子看起 #ifndef C_Class #define C_Class suct #endif C_Class A { C_Class A *A_this; void (*Foo)(C_Class A *A_this); int a; int b; }

JavaScript模拟实现继承的方法_javascript技巧

本文实例讲述了JavaScript模拟实现继承的方法.分享给大家供大家参考.具体分析如下: 我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类, //父类 function ParentClass() { this.className = "ParentClass"; this.auth = "Auth"; this.

Lua下通过元表模拟OOP编程,继承多态

Lua本身是没有以明确的定义来支持OOP编程的,但是我们却可以通过Lua内核提供的一些特性来间接实现简单的面向对象的编程.  通过Lua中的 table结构  metatable 以及函数可以配合实现OOP,以及继承.这些说白了都是一种伪实现,不建议在Lua下使用多重继承 . 在LUA中你想要 强制实现OOP 你必须需要懂一下几个关键词!! 什么是语法糖? 语法糖即糖衣语法,C/C++升级过程中的面向对象 整体就是一种语法糖 ,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin

C++箴言:谨慎使用私有继承

在<C++箴言:确保公开继承模拟"is-a">一文中论述了 C++ 将 public inheritance(公有继承)视为一个 is-a 关系.当给定一个 hierarchy(继承体系),其中有一个 class Student 从一个 class Person 公有继承,当为一个函数调用的成功而有必要时,需要将 Students 隐式转型为 Persons,它通过向编译器展示来做到这一点.用 private inheritance(私有继承)代替 public inher

深入.NET平台和C#编程---总结

一   第一章  1 简述.NET框架体系结构的组成    答:包括CLR(公共语言进行时)和框架类库. 2 简述CLR的主要用途    答:它是所有的,NET应用程序运行时环境,是所有.NET应用程序都要使用的编程基础,它如同一个支持.NET应用程序运行和开发的虚拟机.包括CTS和CLS.   CTS-通用类型系统:用于解决不同语言的数据类型不同的问题,所有.NET语言共享这一类型系统,在他们之间实行无缝互操作.  CLS-公共语言规范:最低的语言标准,所有运行在.NET平台上的语言所必须支持

JavaScript模拟实现继承的方法

 这篇文章主要介绍了JavaScript模拟实现继承的方法,实例分析了javascript类的操作与模拟实现继承的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JavaScript模拟实现继承的方法.分享给大家供大家参考.具体分析如下: 我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类, ? 1 2 3 4 5 6 7 8 9 /

JavaScript 高级篇之闭包、模拟类,继承(五)_javascript技巧

一.javascript中的闭包 1.我们一起先来理解什么是函数的作用域. 2.调用的对象 结合例子: 复制代码 代码如下: function display(something) { function executeDisplay1() { document.write("我在帮老板打印:"+something+"<br />");//引用外部函数的something参数 } executeDisplay1();//函数display引用了内部函数 }

在JavaScript中模拟类(class)及类的继承关系_javascript技巧

Javascipt语法不支持"类"(class)[es6已经支持],但是有模拟类的方法.今天我主要谈谈Javascipt中模拟"类"的方法及js中继承的总结和回顾. js中实现"类"与继承,既是重点,又是难点.很多同学可能都对js中"类"与继承都有所了解,但是深入剖析的时候,感觉力不从心.模棱两可. 我们先来总结一下js定义"类"的几种方法: 方法一:构造函数法 这个方法是比较经典的方法,我们会经常见到.生

php利用反射真正实现多继承(非接口模拟)

昨天我在写PHP程序的时候,无意发现在PHP的::操作符非常强大,不仅仅是只用在访问parent,sel,静态成员属性.常量上面,其实他的功能强大了去了 . 这个符号在PHP中实际上叫做范围解析符,这是PHP官方的解释php.net/manual/zh/language.oop5.paamayim-nekudotayim.php.但是官方中文部分只是简单的介绍了 访问parent,sel,静态成员属性.常量的作用,而下面英文部分,可能由于咱们这些吊死对英文不好的缘故,就没看下去了,实现上,下面还