Go如何使用实现继承的组合?

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

版权声明:本文博客原创文章,博客,未经同意,不得转载。