首页 > 解决方案 > Golang OOP 说明

问题描述

我有两个接口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
}

我对此有几个问题,即:

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

我试着问了几位同事,他们似乎倾向于polymorphism作为答案,尽管他们不太确定。多态性的维基百科条目说它“是为不同类型的实体提供单一接口”,但这对我来说就像是直接相反。我还在其他来源(例如this)中发现 Go 是“不是真正的 OOP 语言”。

标签: oopgo

解决方案


是的,z同时实现xy。您可以通过使用变量声明将具体类型分配给接口类型来证明这一点:

var _ x = z{}
var _ y = z{}

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

附带说明一下,如果您明确想要y成为x + some more methods,那么这样写是有意义的:

interface y {
    x
    b()
}

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

此外,在 Go 中,类型(也包括非结构类型)在定义时与接口无关。即使一个类型不是为了实现某个接口而编写的,您也可以通过定义具有不同名称和/或该类型方法的不同组合的新接口来使其实现任意数量的接口这使得给概念命名变得更加困难 - 当接口可能稍后在另一个包中定义时,您如何知道类型定义时的名称?


推荐阅读