
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.****.net/gophers
版权声明:本文博客原创文章,博客,未经同意,不得转载。