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