Golang OOP澄清

Poh*_*How 2 oop go

我有两个写入的接口go,一个是另一个的子集

type x interface {
    a()
}

type y interface {
    a()
    b()
}
Run Code Online (Sandbox Code Playgroud)

我也有一个结构,有这样的方法

type z struct {
    some string
}

func (s z) a() {
    // do stuff
}

func (s z) b() {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

我对此有几个问题,即:

  1. 我是否正确地说z实现了x和y?
  2. 以这种方式实现多个接口的一个结构的OOP概念是什么?

我试着问几个同事,他们似乎倾向于polymorphism作为答案,尽管他们不太确定.在维基百科条目的多态性说,它"是一个单一的界面,不同类型的实体的规定",但这种感觉就像直接反向给我.我还在其他来源(例如,这个)中发现Go"不是真正的OOP语言".

svs*_*vsd 7

是的,z实现两者xy.您可以通过使用变量声明来为接口类型指定具体类型来证明:

var _ x = z{}
var _ y = z{}
Run Code Online (Sandbox Code Playgroud)

这为您提供了编译时检查,以确保类型实现您想要的接口.

作为旁注,如果你明确想y成为x + some more methods,那么写它是这样的:

interface y {
    x
    b()
}
Run Code Online (Sandbox Code Playgroud)

关于命名,如果一个类型实现了两个共享某些方法的不同接口,我只是称之为 - 一个实现两个不同接口的类型.一个接口是另一个接口的子集并不重要.

此外,在Go中,类型(非结构类型)在定义时不与接口相关联.即使类型未写入实现一些接口,可以它通过定义不同的名称和/或从该类型的方法的不同组合新的接口实现任意数量的接口.这使得给名字更加努力的理念-你怎么知道何时接口可以稍后在另一个包中定义的类型定义时的名字吗?