在 Go 中显式选择接口的实现方法
Explicitly choosing implementation methods for interfaces in Go
说我必须遵循实现 Foo
:
的接口 Foo
和 A
以及 B
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() {}
如果我想要 A
中的 SayHi
方法而不是 [=14 中的 SayBye
方法,那么什么是最好的 语法方法 =]?
我总能做到:
type AB struct {
a A
b B
}
func(ab AB) SayHi() { ab.a.SayHi() }
func(ab AB) SayBye() { ab.a.SayBye() }
但这需要我为每个方法创建一个包装器。另一种方法是将 A
和 B
嵌入到 AB
中,但这会产生冲突。
您可以嵌入 2 个 接口 类型,这些类型只定义了您想要使用(“继承”)的不同类型的部分(方法):
type AB struct {
Hier
Byer
}
type Hier interface {
SayHi()
}
type Byer interface {
SayBye()
}
基本上使用Hier
和Byer
“屏蔽”其他方法,所以嵌入它们(而不是A
和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
当然如果我们现在有Hier
和Byer
,我们可以用它们来简化Foo
如果我们想:
type Foo interface {
Hier
Byer
}
说我必须遵循实现 Foo
:
Foo
和 A
以及 B
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() {}
如果我想要 A
中的 SayHi
方法而不是 [=14 中的 SayBye
方法,那么什么是最好的 语法方法 =]?
我总能做到:
type AB struct {
a A
b B
}
func(ab AB) SayHi() { ab.a.SayHi() }
func(ab AB) SayBye() { ab.a.SayBye() }
但这需要我为每个方法创建一个包装器。另一种方法是将 A
和 B
嵌入到 AB
中,但这会产生冲突。
您可以嵌入 2 个 接口 类型,这些类型只定义了您想要使用(“继承”)的不同类型的部分(方法):
type AB struct {
Hier
Byer
}
type Hier interface {
SayHi()
}
type Byer interface {
SayBye()
}
基本上使用Hier
和Byer
“屏蔽”其他方法,所以嵌入它们(而不是A
和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
当然如果我们现在有Hier
和Byer
,我们可以用它们来简化Foo
如果我们想:
type Foo interface {
Hier
Byer
}