12 介面型別 2 斷言與多型

2021-10-10 15:31:07 字數 1819 閱讀 3554

介面是程式設計的規範,他也可以作為函式的引數,以讓函式更具備適用性。在下列示例中,有三個介面動物介面、飛翔介面、游泳介面,兩個實現類鳥類與魚類:

package main

import

"fmt"

// 定義乙個通用介面:動物介面

type animal inte***ce

type flyer inte***ce

type swimer inte***ce

// 定義乙個鳥類:其呼吸的方式是在陸地

type bird struct

func

(b *bird)

breath()

func

(b *bird)

fly(

)// 一定乙個魚類:其呼吸方式是在水下

type fish struct

func

(f *fish)

breath()

func

(f *fish)

swim()

// 乙個普通函式,引數是動物介面

func

display

(a animal)

func

main()

display

(b)}

介面型別無法直接訪問其具體實現類的成員,需要使用斷言(type assertions),對介面的型別進行判斷,型別斷言格式:

t := i.

(t)//不安全寫法:如果i沒有完全實現t介面的方法,這個語句將會觸發宕機

t, ok := i.

(t)// 安全寫法:如果介面未實現介面,將會把ok擲為false,t擲為t型別的0值

上述案例的dsiplay就可以書寫為:

func

display

(a animal)

else

}

在介面定義時,其型別已經確定,因為介面的本質是方法簽名的集合,如果兩個介面的方法簽名結合相同(順序可以不同),則這2個介面之間不需要強制型別轉換就可以相互賦值,因為go編譯器在校驗介面是否能賦值時,比較的是二者的方法集。

func

display

(a animal)

else

}

其實,斷言還可以將介面轉換成另外乙個介面:

func

display

(a animal)

else

}

乙個實現類往往實現了很多介面,為了精準型別查詢,可以使用switch語句來判斷物件型別:

var v1 inte***cep

=...

switch v := v1.

(type

)

多型是物件導向的三大特性之一,即乙個型別具備多種具體的表現形式。

上述示例中,鳥和魚都實現了動物介面的 breath方法,即動物的breath方法在鳥和魚中具備不同的體現。我們在new出動物的具體物件例項時,這個物件例項也就實現了對應自己的介面方法。

// new出animal的函式

func

newanimal

(kind string

) animal

case

"魚類"

:return

&fish

default

:return

nil}

}func

main()

go 型別斷言 (57)介面的型別斷言

go提供了乙個方法,用來判斷介面的底層值是什麼型別 型別斷言提供了訪問介面值底層具體值的方式。t i.t 該語句斷言介面值i儲存了具體型別t,並將其底層型別為t的值賦予變數t。若i並未儲存t型別的值,該語句就會觸發乙個panic。為了判斷乙個介面值是否儲存了乙個特定的型別,型別斷言可返回兩個值 其底...

java筆記四 介面與多型

public inte ce swimmer介面中的方法沒有操作時,必須得公開且抽象,為了方便可以省略public abstract public inte ce swimmer物件若想擁有swimmer定義的行為,就必須操作介面 eg fish擁有swimmer行為 package openhom...

D0819 介面與多型

介面中的方法全都是抽象方法,用來指定一些規則,讓子類去重寫。介面的作用主要體現在一下兩點 1.指定規則 2.利用這些規則給類做功能擴充套件介面使用inte ce關鍵字來定義,使用implements來實現。定義介面 public inte ce inter 實現介面 public class int...