在 Go 中显式选择接口的实现方法

假设我必须遵循接口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


一只斗牛犬
浏览 193回答 1
1回答

宝慕林4294392

您可以嵌入 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 HiB says Bye当然,如果我们现在有Hierand Byer,我们可以使用它们来简化Foo,如果我们想:type Foo interface {    Hier    Byer}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go