golang继承 匿名继承和有名继承

golang是可以实现继承的,但是这种继承并不是严格意义上的继承,golang并不支持继承特性,因而也没有单继承,多继承,重写方法等复杂概念。

下面通过一些例子来讲解golang的继承

组合继承

(1)匿名继承

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

type People struct{}

func (p *People) ShowA() {

    fmt.Println("showA")

    p.ShowB()

}

func (p *People) ShowB() {

    fmt.Println("showB")

}

type Teacher struct {

    People

}

func (t *Teacher) ShowB() {

    fmt.Println("teacher showB")

}

func main() {

    t := Teacher{}

    t.ShowA()        //showA\nshowB

    t.People.ShowA() //showA\nshowB

    t.ShowB()        //teacher showB

    t.People.ShowB() //showB

}

  

解释输出结果:

t.ShowA() 输出:showA\nshowB。 调用showA时,因为Teacher没有ShowA()的方法,此时又匿名继承了People,所以会调到People实现的ShowA方法去

t.People.ShowA() 输出:showA\nshowB。 匿名继承时指定调用的结构体方法,这时候一定会调用People上的ShowA方法,如果People没有该方法会编译报错

t.ShowB() 输出:eacher showB。 因为Teacher本身有实现ShowB方法,所以会调用到 Teacher的ShowB方法。

t.People.ShowB() 输出:showB。 此时如果我们想调用People的ShowB方法只能时通过指定结构体的方法。

(2)有名继承

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

type People struct{}

func (p *People) ShowA() {

    fmt.Println("showA")

    p.ShowB()

}

func (p *People) ShowB() {

    fmt.Println("showB")

}

type Teacher struct {

    P People

}

func (t *Teacher) ShowB() {

    fmt.Println("teacher showB")

}

func main() {

    t := Teacher{}

    t.ShowA()        //报错

    t.People.ShowA() //报错

    t.People.ShowB() //报错

    t.ShowA()       // 报错

    t.ShowB()   //teacher showB

    t.P.ShowA() //showA\nshowB

    t.P.ShowB() //showB

}

  

输出结果解释:

t.ShowA() 结果:报错。 Teacher没有ShowA的方法,虽然People有,但是此时People不是匿名继承 ,如果要要调用需要指定继承事指定的名称。

t.People.ShowA() 结果:报错。 t里没有这个对象,此时People在结构体的名称为P,而不是People,此时的People是P的类型

t.People.ShowB() 结果:报错。 同时上

t.ShowB()  结果:teacher showB。 调用teacher的ShowB方法

t.P.ShowA() 结果:showA\nshowB 。有名继承,People是P的类型,此时调用People的ShowA方法

t.P.ShowB() //showB 同上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值