golang interface淺談

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

golang 的介面設計是這門程式設計語言的兩大亮點之一,本文僅淺談golang介面和其它語言(以C++為例)的區別。

引用《Go語言編程》作者在書中的話,go語言中的介面是“非侵入式”的,而其它語言中的介面是“侵入式”的。因此,需要對非侵入式和侵入式分別理解才能理解清楚golang 介面的優點

首先 讓我們看看C++中的介面:

在C++中,介面的實現必須要通過繼承

 

```cpp

interface IFoo{    void Bar();}class Foo: public IFoo{}IFoo *Foo=new IFoo;

 

在此類語言中 即使另外有一個介面IFoo2實現了與IFoo完全一樣的介面方法,甚至名字相同只不過位於不同的名字空間下,編譯器也會認為上面的類Foo只實現了IFoo的介面,而沒有實現IFoo2的介面

此類介面稱為侵入式介面。“侵入式”的主要表現是實作類別必須明確表示自己實現了某個介面。在C++裡面表示為需要繼承。

舉一個具體的執行個體:

#include <iostream>using namespace std;class Person{    public:    Person():m_strName("###"){};    virtual void SetName(const string name)=0;    private:    string m_strName;};class Person2{    public:    Person2():m_strName("###"){};    virtual void SetName(const string name)=0;    private:    string m_strName;};class Student:public Person{    public:    Student():m_strName("***"){};    void SetName(const string name);    private:    string m_strName;};void Student::SetName(const string name){    std::cout << m_strName << std::endl;    m_strName=name;    std::cout << m_strName << std::endl;}int main() {    Student s;    Person *p;    p=&s;    Person2 *p2;    p2=&s;    return 0;}

 

在這裡 因為Student沒有聲明繼承Person2 所以 針對 p2=$s;這段代碼 會出現:“cannot convert Struden* to Person2 in assignment”這樣的錯誤。

而在GO語言中,一個類只要實現了該介面所有的函數,就代表這個類實現了該介面

type file struct{}func(f *File) Read(buf []byte)(n int, err error)func(f *File) Write(buf []byte)(n int, err error)func(f *File) Seek(off int64, err eror)(pos int, err error)func(f *File) Close() err errortype IFile interface{    Read(buf []byte)(n int, err error)    Write(buf []byte)(n int, err error)    Seek(off int64, err eror)(pos int, err error)    Close() err error}type IReader interface{Read(buf []byte)(n int, err error)}type IWriter interface{ Write(buf []byte)(n int, err error)}type ICloser interface{ Close() err error}

 

儘管file類並沒有從這些介面繼承,甚至可以不知道這些介面的存在,但是file實現了這些介面的所有方法,就可以說file類實現了這些介面,可以進行賦值

其實我們可以用一個通俗的例子來進行一下說明:

對於侵入式介面,假設你在參加高考,但不是全國統考,而是高校自主命題,此時有X大學和Y大學兩所學校,他們的考試題目是完全相同的,錄取分數也是完全相同的,但就算你參加了X大學的考試,達到了X大學的分數線,你也不能申請就讀Y大學,要想申請Y大學,你必須再次參加Y大學的考試並達到Y大學的分數線,這裡的參加考試並達到分數線就相當於C++中的繼承,如果沒有聲明繼承,就不能說明實現了某個介面

而對於非侵入式介面,同樣是高考,但這次是全國統考,你考過了分數線,這個時候 你既能申請X大學,又能申請Y大學,因為你達到了這兩所大學所要求的統一分數,相當於你實現了X和Y兩個介面裡的所有方法,所以既能調用X 又能調用Y

綜上,侵入式介面和非侵入式介面區別的關鍵在於是否需要明確聲明你的類實現了某個介面。

以上僅代表個人理解,對於不對的或者不恰當的地方,歡迎批評和指正。

1410 次點擊  ∙  2 贊  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.