我有两个用go
编写的接口,一个是另一个的子集
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 for polymorphism说它“是为不同类型的实体提供单一接口”,但这感觉就像直接反向我。我还在其他来源(例如this)中发现Go“不是真正的OOP语言”。
是的,z
同时实施x
和y
。您可以通过使用变量声明来为接口类型指定具体类型来证明:
var _ x = z{}
var _ y = z{}
这为您提供了编译时检查,以确保类型实现您想要的接口。
作为旁注,如果你明确地希望y
是x + some more methods
,那么写它是这样的:
interface y {
x
b()
}
关于命名,如果一个类型实现了两个共享某些方法的不同接口,我只是称之为 - 一个实现两个不同接口的类型。一个接口是另一个接口的子集并不重要。
此外,在Go中,类型(非结构类型)在定义时不与接口相关联。即使没有编写类型来实现某个接口,也可以通过定义具有不同名称和/或类型的不同方法组合的新接口来实现任意数量的接口。这使得概念的名称更加难以理解 - 当接口可能稍后在另一个包中定义时,您如何知道类型定义时的名称?
我一开始很难掌握Go接口的问题。我来自Java,C ++,Python的多年经验......最好的方法是恕我直言,以及任何其他新语言不是用Go语法编写Java或C ++。了解Go中的工作原理并使用它。术语可能不是精确的一对一映射,这无关紧要。
将Go接口视为在一组数据(结构)上运行的一组方法签名。类似于Java接口只是一类方法签名的集合。主要区别在于,在Go中,您不需要指定struct implements
是一个接口,该语言将为您做到这一点。如果在结构上指定方法,它会自动实现该接口。
你说z实现两个接口都是对的。
接口本身就是一种通用的编程概念,对于面向对象的语言而言并不是空间。一些面向对象的语言(如Java和Go)提供了一种定义和实现接口的方法,而其他语言则没有。
它实际上是一种多态,因为您说一组特定的函数或方法可能由不同的数据结构类型实现。正如维基百科的文章所暗示的那样。它也可以被认为是类型抽象。
Go能够支持面向对象和面向程序的编程风格。它被认为是面向对象的编程语言。
Go是一种强类型语言,除了通过数据结构定义类型的另一种方式之外,接口允许Go程序员通过他们的方法定义类型。