如何解决明确选择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() {}
如果我希望使用SayHi
中的A
方法而不是SayBye
中的B
方法,什么是最好的句法方法?>
我总能做到:
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个 interface 类型,它们仅定义要使用的不同类型的部分(方法)(“继承”):
wget --quiet -E -H -k -nd -K -p -e robots=off #{url}
基本上使用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") }
输出将是(在Go Playground上尝试):
var ab Foo = AB{
Hier: A{},Byer: B{},}
ab.SayHi()
ab.SayBye()
当然,如果我们现在有A says Hi
B says Bye
和Hier
,那么我们可以使用它们来简化Byer
:
Foo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。