golang 隐式继承

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 的所有方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值