這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 maintype 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