區塊鏈技術語言(二十五):面向物件——介面
多型是面向物件的三大基本特性之一。多型是指對於不同的例項,同樣的操作可能會有不同的表現形式。例如加法操作,如果操作的資料是數,那麼它對兩個數進行求和;如果操作的資料是字串,那麼它將連線兩個字串。
多型機制使具有不同內部結構的物件可以共享相同的外部介面。這意味著,雖然針對不同物件的具體操作不同,但通過一個公共的類,那些操作可以通過相同的方式予以呼叫。這樣可以減少程式碼的複雜度。
在Go語言裡,定義這些操作的類叫作介面(interface)。
1
介面的概述
在Go語言中,介面是一個自定義型別,具體描述了一系列方法的集合。它是一種抽象的型別,不會暴露出它所代表的物件的內部值結構和這個物件支援的基礎操作的集合,它們只會展示出它們自己的方法,即介面指定了一個型別應該具有的方法,並由該型別決定如何實現這些方法。
在Go語言中,當一個型別定義了介面中的所有方法,我們稱它實現了該介面。
2
介面的定義與實現
2.1 介面的定義
介面的定義格式與結構體類似,介面的定義需要關鍵詞type和interface。定義如下:
注:a. 接⼝命名習慣上以er結尾;
b.介面中只有方法宣告,沒有資料欄位。
2.2 介面的實現
介面是用來定義行為的型別。這些被定義的行為不由介面直接實現,而是通過方法由使用者定義的型別來實現。在Go語言中,使用者定義的型別實現了介面宣告的所有方法,那麼這個型別就隱式地實現了這個介面,而這個型別就是實現這個介面型別的例項。
介面可以分為普通介面和嵌入介面。普通介面指的是定義了一組方法的介面,嵌入介面指的是一個接口裡嵌入了其他介面。
2.2.1 普通介面的實現
普通介面的實現,即物件的型別實現了普通接口裡定義的所有方法。介面對物件的型別沒有限制,既可以是值型別,也可以是指標型別。
2.2.2 嵌入介面的實現
介面可以匿名嵌入其它介面,Go語言沒有提供繼承機制,但可以通過巢狀其他的介面,建立一個新介面。
如果一個interface1作為interface2的一個嵌入欄位,那麼interface2隱式的包含了interface1裡面的方法。
3
介面型別變數的賦值
在Go語言中能實現介面型別變數賦值的有兩種情況:將物件例項賦值給介面型別變數,將一個介面型別變數賦值給另一個介面型別變數。
3.1 將物件例項賦值給介面型別變數
將某種型別的物件例項賦值給介面型別變數,這要求該物件例項實現了介面要求的所有方法。這個賦值會把使用者定義的型別值存入到這個介面型別的變數。
如果物件例項實現了介面中的所有方法,這些方法的接收者型別中有一個是指標型別,那麼賦值給這個介面變數的物件例項必須是指標型別。如果將一個值型別的例項賦值給此介面變數,程式在編譯期出錯,這是因為介面中儲存的具體值並不能取到地址,無法實現接收者型別為指標型別的方法。
如果物件例項實現介面的所有方法的接收者型別都是值型別,那麼賦值給介面型別變數的例項既可以是值型別,也可以是指標型別,因為介面中儲存的地址可以取到值,這也就實現了接收者型別為值型別的方法。
3.2 將一個介面賦值給另一個介面
如果介面A的方法列表是介面B的方法列表的子集,那麼介面B可以賦值給介面A。介面B被稱作超集介面,介面A被稱作子集介面。超集介面的物件可轉換為子集介面,反之出錯。
4
空介面
沒有包含方法的介面稱為空介面,空介面表示為“interface{}”。由於空介面沒有方法,因此所有型別都實現了空介面,因此空介面可以儲存任意型別的數值。
5
型別查詢
介面的內部結構可以看作一對“type:value”:type 是介面底層的具體型別,而 value 是具體型別所對應的值。
根據介面變數反向確認介面型別變數儲存的型別和值的方法有兩種:型別斷言和型別選擇。
5.1 型別斷言
型別斷言用於提取介面的底層值。Go語言存在一個語法:根據斷言的型別判斷這個介面變數是否儲存的是該型別值。其語法格式如下:
注:a. i是介面變數;
b. T是斷言的型別,value是儲存在介面變數裡與型別T對應的值;
c. ok是布林值:如果T和value是介面底層的型別和值,ok返回true,否則返回false。
5.2 型別選擇
型別選擇用於將介面的具體型別與很多case 語句所指定的型別進行比較。它與一般的 switch 語句類似,唯一的區別在於型別選擇指定的是型別,而一般的switch指定的是值。
型別選擇的語法類似於型別斷言。型別斷言的語法是 i.(T),而對於型別選擇,型別 T 由關鍵字 type 代替,如下所示:
注:當某一個case語句之後的型別通過i.(type)得到的介面底層值不為空,則執行該case之後的語句。
ofollow,noindex">原文連結:區塊鏈技術語言(二十五):面向物件——介面
參考資料:
[1] 譚浩強.C++面向物件程式設計[M]. 清華大學出版社,2006
[2] 陳維興,陳昕.C++面向物件程式設計[M]. 人民郵電出版社,2010
[3] https://www.studygolang.com/articles/12266
[4] https://studygolang.com/articles/12325
[5] 許式偉,呂桂華.Go語言程式設計[M].北京:人民郵電出版社,2012:74-78.
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”