golang 隐式继承
概念
对于一个面向对象编程语言来说
class Parent:
def __init__(self):
self.value = "Inside Parent"
def show(self):
print(self.value)
class Child(Parent):
def __init__(self):
super().__init__()
self.value = "Inside Child"
def display(self):
print(self.value)
# 创建对象
parent = Parent()
parent.show()
child = Child()
child.show() # 继承自父类的方法
child.display()
这段代码,Child
类继承了Parent
类,我们在使用实例化Child
类时,就可以使用Parent
类中的所有方法
但在 Go 语言中,明确规定是没有继承这个概念,并且类的概念也是没有的,但是我们可以通过一些曲线的方法来实现,例如
通过类型约束实现类
type Von struct {
}
func (v Von) func1() error {
return nil
}
func (v Von) func2() error {
return nil
}
……
那么继承,也可以通过类型嵌套来实现
类型嵌套继承
下面是一段完整的代码,包含interface
的实现
type TemplateList interface {
Valid() error
}
type Von struct {
}
func (v Von) Valid() error {
return nil
}
type CClaims struct {
UserId uint32
Von Von
}
func CreatibiClaimsFunc() TemplateList {
return &CClaims{}
}
上面代码会报错 cannot use &CClaims{} (value of type *CClaims) as TemplateList value in return statement: *CClaims does not implement TemplateList (missing method Valid)compiler
因为CClaims
中并未直接实现TemplateList
接口,虽然它包含的Von
实现了TemplateList
接口,也就以为这,没有继承Von
的属性
我们只需改动一处代码即可
type CClaims struct {
UserId uint32
Von
}
CClaims通过匿名字段Von继承了Von的所有方法,包括Valid
方法。因此,CClaims 类型(以及它的指针)可以被赋值给TemplateList
接口,因为它们实际上实现了Valid方法。
由于 Von
是一个匿名字段,CClaims
结构体隐式地继承了 Von 的所有方法