亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中顯式選擇接口的實現方法

在 Go 中顯式選擇接口的實現方法

Go
一只斗牛犬 2022-06-27 17:12:39
假設我必須遵循接口Foo以及A哪些B實現Foo:type Foo interface {    SayHi()    SayBye()}type A struct {}func(a A) SayHi() {}func(a A) SayBye() {}type B struct {}func(b B) SayHi() {}func(b B) SayBye() {}如果我想要方法 from但方法 from ,最好的語法方法是什么?SayHiASayByeB我總是可以這樣做:type AB struct {    a A    b B}func(ab AB) SayHi() { ab.a.SayHi() }func(ab AB) SayBye() { ab.a.SayBye() }但這需要我為每個方法創建一個包裝器。另一種方法是嵌入,A但這會產生沖突。BAB
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

您可以嵌入 2種接口類型,它們僅從不同類型定義要使用(“繼承”)的部分(方法):


type AB struct {

    Hier

    Byer

}


type Hier interface {

    SayHi()

}

type Byer interface {

    SayBye()

}

基本上使用Hierand Byer“屏蔽”其他方法,因此嵌入它們(而不是Aand B)將解決名稱沖突(歧義)。


讓我們讓實現打印他們是誰以進行驗證:


func (a A) SayHi()  { fmt.Println("A says Hi") }

func (a A) SayBye() { fmt.Println("A says Bye") }

func (b B) SayHi()  { fmt.Println("B says Hi") }

func (b B) SayBye() { fmt.Println("B says Bye") }

使用它:


var ab Foo = AB{

    Hier: A{},

    Byer: B{},

}

ab.SayHi()

ab.SayBye()

輸出將是(在Go Playground上嘗試):


A says Hi

B says Bye

當然,如果我們現在有Hierand Byer,我們可以使用它們來簡化Foo,如果我們想:


type Foo interface {

    Hier

    Byer

}


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號