go - 在 Go 中显式选择接口(interface)的实现方法

标签 go methods struct interface embedding

假设我必须关注接口(interface) FooAB实现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() }
但这需要我为每个方法创建一个包装器。另一种方法是嵌入 AB进入 AB但这会造成冲突。

最佳答案

您可以嵌入 2 种接口(interface)类型,它们仅从不同类型定义您想要使用(“继承”)的部分(方法):

type AB struct {
    Hier
    Byer
}

type Hier interface {
    SayHi()
}
type Byer interface {
    SayBye()
}
基本上使用HierByer “屏蔽”其他方法,因此嵌入它们(而不是 AB )将解决名称冲突(歧义)。
让我们让实现打印他们是谁以进行验证:
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
当然,如果我们现在有 HierByer , 我们可以用它们来简化 Foo如果我们想:
type Foo interface {
    Hier
    Byer
}

关于go - 在 Go 中显式选择接口(interface)的实现方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63909802/

相关文章:

go - TestMain - 没有要运行的测试

java - 在 JTextField 中创建用户无法在 java 中编辑的文本

JavaScript 和 NodeJS : Calling method from different JS file

c - 如何将 typedef 结构数组的变量复制并传输到另一个 - C

c - 复制传递给函数的字符串作为 C 中的参数

linux - AT 命令与/dev/tty* 交换

去 GC 奇怪的行为

go - 为什么 atomic.StoreUint32 优于 sync.Once 中的正常分配?

java - 请求方法 'DELETE'不支持-reactjs + spring Boot

c - 如何引用另一个 C 文件中的变量?