go语言面向对象-继承(匿名组合)

匿名组合

确切地说,Go语言也提供了继承,但是采用了组合的文法,所以我们将其称为匿名组合:

type Base struct {
  Name string
}
func (base *Base) Foo() { ... }
func (base *Base) Bar() { ... }

type Foo struct {
      Base
      ...
}
func (foo *Foo) Bar() {
    foo.Base.Bar()
    ...
}

以上代码定义了一个 Base 类(实现了 Foo() 和 Bar() 两个成员方法) ,然后定义了一个Foo 类,该类从 Base 类“继承”并改写了 Bar() 方法(该方法实现时先调用了基类的 Bar()方法) 。
在“派生类” Foo 没有改写“基类” Base 的成员方法时,相应的方法就被“继承” ,例如在上面的例子中,调用 foo.Foo() 和调用 foo.Base.Foo() 效果一致。

与其他语言不同,Go语言很清晰地告诉你类的内存布局是怎样的。此外,在Go语言中你还
可以随心所欲地修改内存布局,如:

type Foo struct {
... // 其他成员
Base
}

这段代码从语义上来说,和上面给的例子并无不同,但内存布局发生了改变。 “基类” Base
的数据放在了“派生类” Foo 的最后。另外,在Go语言中,你还可以以指针方式从一个类型“派生” :

type Foo struct {
*Base
...
}

这段Go代码仍然有“派生”的效果,只是 Foo 创建实例的时候,需要外部提供一个 Base 类实例的指针。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • 写在之前 因为简书字数限制,完整版地址:https://www.zybuluo.com/hainingwyx/no...
    hainingwyx阅读 14,016评论 0 41
  • 一米 1、 和Q先生相遇的那天,我刚吃完火锅回家,记得那天穿了一件白衬衫,注重外在形象的我从来都不顾及吃相,白衬衫...
    辞不尽意阅读 358评论 1 7
  • 这几天迷郝蕾,始于《情满四合院》里精彩的演出,始于傻柱、秦淮茹的人生选择,进而了解郝蕾其人,其作品。对于郝蕾的人生...
    剡中奇谭阅读 405评论 0 0
  • 战争是手段,而非目的。匪气完成生存,但是宗教才是决胜之地,爱。 但过程是,每个人都会在残暴和慈悲之间,经历很多回合...
    咸叔说阅读 400评论 1 5