我有两个用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
作为答案,尽管他们不太确定。多态的维基百科条目说它“是为不同类型的实体提供单一接口”,但这对我来说是一种直接的相反。我还在其他来源找到了(如。这)是“并不是一个真正的OOP语言”。
发布于 2018-08-29 20:27:19
是的,z
实现了x
和y
。您可以通过使用变量声明将具体类型分配给接口类型来证明这一点:
var _ x = z{}
var _ y = z{}
这将为您提供一个编译时间检查,以确保某个类型实现了您希望它实现的接口。
顺便提一句,如果您明确希望y
成为x + some more methods
,那么将它写成这样是有意义的:
interface y {
x
b()
}
关于命名,如果一个类型实现了两个共享某些方法的不同接口,我就称之为它--一个实现两个不同接口的类型。一个接口是另一个接口的子集并不重要。
此外,在Go中,类型(也是非结构类型)在定义接口时不与接口关联。即使类型不是为了实现某些接口而编写的,您也可以通过定义具有不同名称和/或与类型不同的方法组合的新接口来使其实现任意数量的接口。这使得给这个概念命名更加困难--在定义类型时,当接口可能稍后在另一个包中定义时,您如何知道名称?
发布于 2018-08-29 20:40:06
一开始,我很难掌握Go接口的窍门。我来自爪哇,C++,Python的多年经验.IMHO最大限度地利用Go和任何其他新语言的最佳方法是不使用Go语法编写Java或C++。了解事物是如何运作的,并加以利用。术语可能不是精确的1到1映射,这并不重要。
将Go接口看作一组在某些数据组(struct)上操作的方法签名。类似于Java接口只是类上的一组方法签名。主要的区别是,在Go中,您不需要指定结构implements
(一个接口),语言将为您完成这一任务。如果在结构上指定方法,它将自动实现接口。
发布于 2018-08-29 20:42:45
您正确地说,z实现了这两个接口。
接口本身是一个通用的编程概念,而不是面向对象语言的泛泛性概念。一些面向对象的语言(如Java和Go )提供了一种定义和实现接口的方法,而其他语言则没有。
实际上,它是一种多态类型,因为您是说一组特定的函数或方法可以通过不同的数据结构类型来实现。正如维基百科的文章所暗示的。它也可以被认为是类型抽象。
Go能够支持面向对象和面向过程的编程风格。它被认为是一种面向对象的编程语言。
Go是一种强类型语言,接口允许Go程序员通过其方法定义类型,以及通过数据结构定义类型的其他方法。
https://stackoverflow.com/questions/52088759
复制相似问题