go 继承

go里面严格来说是没有继承的

所谓的继承是通过匿名字段的组合来实现的

在使用其多态的时候可能会出问题

它不像java那种, 根据实际传入的类型来选择方法

type A struct {}
type B struct {
    A			// 只写出类型, 没有变量名 -- > 匿名字段
}

func (p *A) Show() {
    fmt.Println("start ...")
    p.Show2()
} 
func (p *A) Show2() {
    fmt.Println("AAA")
}

func (p *B) Show2() {	// 名称也是Show2 (属于结构体函数, 可以这样写, 不会报错)
    fmt.Println("BBB")
} 

func main() {
    b := &B{}
    b.Show()        // 相当于b先访问了自己的匿名字段A, A再调用Show()
}

// start ...
// AAA

解析: A,B 两个都是结构体, B是有一个字段是A类型的匿名字段

这种情况下, 我们为B继承了A(其实不是真正意义上的继承, 只是匿名字段而已)

B中没有Show()方法, 但是b.Show()为什么可以执行? 

其实是b.匿名字段.Show()  --> 因为匿名字段没有名字, 只有将其省略, 也就相当于b.Show()

 

当调用: 

func (p *A) Show() {
    fmt.Println("start ...")
    p.Show2()
}

的时候, 其实是匿名字段调用的Show(), 则p的值也就是A的实例

所以最后会调用A的Show2()函数, 这确实和java等其它的语言不同

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值