go语言支持继承吗_Go语言的结构体嵌入为什么不算继承?

今日端午节,又是高考。祝大家节日快乐,祝考生考出好成绩,大家开车请勿鸣笛!

面向对象的设计思想,是根据现实世界进行抽象得出的一套理论。既然是现实世界的抽象,继承的本质是有“父子”关系。比如,动物是父类,猫是子类。不能说有父类的属性和方法就是继承。

Go 语言之所以摈弃继承,主要考虑到,面向对象这么多年的发展,继承被滥用了。但一些继承的特性又很需要,所以,提供了“嵌入”这种东西,方便“模拟”继承,但它的本质是组合,不是继承。

我举一个例子,证明 Go 中的嵌入是组合不是继承。

 1package main
2
3import (
4    "fmt"
5)
6
7type Animal struct {
8    Name string
9    Age  int
10}
11type Cat struct {
12    *Animal
13    Type string
14}
15
16func TestInherit(a *Animal) {
17    fmt.Println(a.Name)
18}
19func main() {
20    cat := &Cat{
21        Animal: &Animal{Name: "xiaohua", Age: 12},
22        Type:   "波斯猫",
23    }
24    TestInherit(cat)
25}

以上代码会编译错误:

cannot use cat (type *Cat) as type *Animal in argument to TestInherit

但按照面向对象的理论:所有能用父类的地方,都可以使用子类(里氏代换原则)。很明显,Go 的嵌入不符合这个要求。

所以,Go 官方 FAQ 中说,Go 既是面向对象语言又不是面向对象语言。对此,你怎么看?

96f0f59933fe92302270e8cbe926f69d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值