分享
  1. 首页
  2. 文章

Go是如何用组合实现继承的

gophers · · 11136 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go提供了很赞的并发支持,但是Go并不支持完全的面向对象。这并不代表Go不支持面向对象,而且Go的OO系统做的非常轻量,学习成本压到了最小。尽管为了做到这种轻量级的面向对象让Go失去了一些OO的方便特性,但是更高的效率和多返回值多少弥补了这一点。


那些完全支持面向对象的语言一般都具有继承的功能。继承有很棒的优点,最简单了讲,就是可以少写代码。当然,继承并不仅仅是让你省了敲几下键盘的功夫,它还能更好的抽象程序中各种类型之间的关系。


Go的OO系统不支持继承,但是可以使用Go中一种叫做"组合"的方法来实现继承。下面演示两段程序,看过了之后你就会明白Go的这种组合技巧了。


C++中的继承:

#include <iostream>
using namespace std;
class Person {
public:
 void Say();
};
void Person::Say() {
 cout << "I'm a person." << endl;
}
// 继承
class Student : public Person {
};
int main() {
 Student s;
 s.Say();
 return 0;
}

等效的Go程序:

package main
type Person struct {
}
func (p *Person) Say() {
 println("I'm a person.")
}
// 组合
type Student struct {
 Person
}
func main() {
 var s Student
 s.Say()
}

这两个程序运行之后结果都是:

I'm a person.


可以看出Go可以通过组合另一个类型来"继承"它的所有行为,十分直观。不过C++和Go的这两段代码表达的意义其实还是有些略微的差别。C++的类继承表示Person是Student的一个父类,具有一种层次关系。但是Go的组合则表达了一种Student是个人,所以Student包含了Person的所有行为,即人能做的事情Student就能做,Student骨子里也是个人。


无论是继承还是组合,"复制"来的行为都是可以重写的~

希望这篇博文让你学会了Go的组合。



如果转载请注明出处:http://blog.csdn.net/gophers



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:gophers

查看原文:Go是如何用组合实现继承的

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
11136 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏