【鏈塊技術33期】區塊鏈技術語言(二十五)——面向對象:接口

原文鏈接:區塊鏈技術語言(二十五)——面向對象:接口

 

多態是面向對象的三大基本特性之一。多態是指對於不同的實例,同樣的操作可能會有不同的表現形式。例如加法操作,如果操作的數據是數,那麼它對兩個數進行求和;如果操作的數據是字符串,那麼它將連接兩個字符串。

多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味着,雖然針對不同對象的具體操作不同,但通過一個公共的類,那些操作可以通過相同的方式予以調用。這樣可以減少代碼的複雜度。

在Go語言裏,定義這些操作的類叫作接口(interface)。

一、接口的概述

在Go語言中,接口是一個自定義類型,具體描述了一系列方法的集合。它是一種抽象的類型,不會暴露出它所代表的對象的內部值結構和這個對象支持的基礎操作的集合,它們只會展示出它們自己的方法,即接口指定了一個類型應該具有的方法,並由該類型決定如何實現這些方法。

在Go語言中,當一個類型定義了接口中的所有方法,我們稱它實現了該接口。

二、接口的定義與實現

2.1 接口的定義

接口的定義格式與結構體類似,接口的定義需要關鍵詞type和interface。定義如下:

注:a. 接⼝命名習慣上以er結尾;

      b.接口中只有方法聲明,沒有數據字段。

2.2 接口的實現

接口是用來定義行爲的類型。這些被定義的行爲不由接口直接實現,而是通過方法由用戶定義的類型來實現。在Go語言中,用戶定義的類型實現了接口聲明的所有方法,那麼這個類型就隱式地實現了這個接口,而這個類型就是實現這個接口類型的實例。

接口可以分爲普通接口和嵌入接口。普通接口指的是定義了一組方法的接口,嵌入接口指的是一個接口裏嵌入了其他接口。

2.2.1 普通接口的實現

普通接口的實現,即對象的類型實現了普通接口裏定義的所有方法。接口對對象的類型沒有限制,既可以是值類型,也可以是指針類型。

2.2.2 嵌入接口的實現

接口可以匿名嵌入其它接口,Go語言沒有提供繼承機制,但可以通過嵌套其他的接口,創建一個新接口。

如果一個interface1作爲interface2的一個嵌入字段,那麼interface2隱式的包含了interface1裏面的方法。

三、接口類型變量的賦值

在Go語言中能實現接口類型變量賦值的有兩種情況:將對象實例賦值給接口類型變量,將一個接口類型變量賦值給另一個接口類型變量。

3.1 將對象實例賦值給接口類型變量

將某種類型的對象實例賦值給接口類型變量,這要求該對象實例實現了接口要求的所有方法。這個賦值會把用戶定義的類型值存入到這個接口類型的變量。

如果對象實例實現了接口中的所有方法,這些方法的接收者類型中有一個是指針類型,那麼賦值給這個接口變量的對象實例必須是指針類型。如果將一個值類型的實例賦值給此接口變量,程序在編譯期出錯,這是因爲接口中存儲的具體值並不能取到地址,無法實現接收者類型爲指針類型的方法。

如果對象實例實現接口的所有方法的接收者類型都是值類型,那麼賦值給接口類型變量的實例既可以是值類型,也可以是指針類型,因爲接口中存儲的地址可以取到值,這也就實現了接收者類型爲值類型的方法。

 

 

3.2 將一個接口賦值給另一個接口

如果接口A的方法列表是接口B的方法列表的子集,那麼接口B可以賦值給接口A。接口B被稱作超集接口,接口A被稱作子集接口。超集接口的對象可轉換爲子集接口,反之出錯。

四、空接口

沒有包含方法的接口稱爲空接口,空接口表示爲“interface{}”。由於空接口沒有方法,因此所有類型都實現了空接口,因此空接口可以存儲任意類型的數值。

五、類型查詢

接口的內部結構可以看作一對“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之後的語句。

參考資料:

[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.

更多請關注“區塊鏈工程師”

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章