为了账号安全,请及时绑定邮箱和手机立即绑定

在 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 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号