我有两个用go
编写的接口(interface),一个是另一个的子集
type x interface {
a()
}
type y interface {
a()
b()
}
我也有一个结构具有这样的方法
type z struct {
some string
}
func (s z) a() {
// do stuff
}
func (s z) b() {
// do stuff
}
我对此有一些疑问,即:
我尝试问了一些同事,尽管他们不太确定,他们似乎倾向于使用
polymorphism
作为答案。用于多态的wikipedia entry表示,它“是为不同类型的实体提供单个接口(interface)”,但这感觉像是对我的直接逆转。我还在其他来源(例如this)中发现Go是“不是真正的OOP语言”。 最佳答案
是的,z
同时实现了x
和y
。您可以通过使用变量声明将具体类型分配给接口(interface)类型来证明这一点:
var _ x = z{}
var _ y = z{}
这样就可以进行编译时检查,以确保类型实现您想要的接口(interface)。
附带说明一下,如果您明确希望
y
为x + some more methods
,则可以这样编写:interface y {
x
b()
}
关于命名,如果一个类型实现了两个共享某些方法的不同接口(interface),我就称其为-一个实现两个不同接口(interface)的类型。一个接口(interface)是另一个接口(interface)的子集并不重要。
此外,在Go中,类型(以及非结构类型)在定义时也不与接口(interface)关联。即使没有编写用于实现某个接口(interface)的类型,也可以通过定义具有不同名称和/或该类型的方法的不同组合的新接口(interface),使其实现任意数量的接口(interface)。这使得为这个概念命名更加困难-当以后在另一个包中定义接口(interface)时,如何在定义类型时知道该名称?