go - 在 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 ,最好的语法方法是什么?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种接口类型,它们仅从不同类型定义要使用(“继承”)的部分(方法):
type AB struct {
Hier
Byer
}
type Hier interface {
SayHi()
}
type Byer interface {
SayBye()
}
基本上使用Hier
and Byer
“屏蔽”其他方法,因此嵌入它们(而不是A
and 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
and Byer
,我们可以使用它们来简化Foo
,如果我们想:
type Foo interface {
Hier
Byer
}
推荐阅读
- c# - 使用 C# 和 System.IO.Compression.ZipArchive 更新现有的 ooxml 文件
- python - 如何使用导入为 linux 用户编写 Python 脚本
- git - Gitlab - 如何在分叉项目中组织分支?
- azure - Azure AD:id_token 作为不记名令牌
- java - 如何使用 ByteBuffer 进行短到 byte[] 的转换?
- powershell - 设置文化的远程执行
- python - 将所有重复行的列更改为相同的值
- python - 使用 Cuda 在 Python 中使用 numba 在 GPU 上创建数组
- linux - 如何检测 Helgrind(valgrind) 是否给出任何错误
- qt - 使用“color mod”绘制 QPixmap 的最佳方法