Go是如何用組合實現繼承的

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.