Golang继承封装,以及匿名组合的继承

golang中不存在private、protected、public,其符号的可见性是在定义符号时设置符号大小写开头来区分。
- 大写:包外可见
- 小写:包内可见

通过这个特性,可以对应的实现Java OOP中封装的概念。

如下

//在该例子中,成员log为小写,包内可见。则如果在同一个包中(如下test方法中),则可以通过name.log的方式访问到golog.Logger中的方法
//  demo/bean/name.go
package bean
type Name struct {
    log golog.Logger
}

func (n Name)NPrint(){
    n.log.Print()
}

func test(){
    name:=Name{}
    name.log.Print()
}

//但是再其他包中,则只能访问到上面定义的NPrint(),访问不到log成员,也就访问不到golog.Logger中的方法
//  demo/file/impl.go
func test(){
    name:=bean.Name{}
    name.NPrint()
}

//这样也就达到了Java OOP中封装的目的。

如果是匿名组合的话,则类似于继承的概念。

//若为匿名组合,则直接可以访问。而不需通过name.log的方式。
//  demo/bean/name.go
type Name struct {
    golog.Logger
}

func (n Name)NPrint(){
    n.Print()
}

//但是再其他包中,也可以直接访问,并不会隐藏。
//  demo/file/impl.go
func test(){
    name:=util.Name{}
    name.Print() //golog.Logger的方法
}

这是为什么匿名成员是包外可见的呢?
这是因为匿名组合类型是相当于用其类型名称(去掉包名部分)作为成员变量的名字的。
比如上面例子可以写成:

//  demo/bean/name.go
type Name struct {
    golog.Logger
}

func (n Name)NPrint(){
    //下面两种方式都可以
    n.Print()
    n.Logger.Print()
}

func (n Name)Print(){
    n.Logger.Print()
    //n.Print()    --->注意:如果写成这样就变成无限循环调用自己的Print,而不是Logger的。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值