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

我对此有一些疑问,即:
  • 我是说z同时实现x和y吗?
  • 以这种方式实现多个接口(interface)的结构的OOP概念是什么?

  • 我尝试问了一些同事,尽管他们不太确定,他们似乎倾向于使用polymorphism作为答案。用于多态的wikipedia entry表示,它“是为不同类型的实体提供单个接口(interface)”,但这感觉像是对我的直接逆转。我还在其他来源(例如this)中发现Go是“不是真正的OOP语言”。

    最佳答案

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

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

    这样就可以进行编译时检查,以确保类型实现您想要的接口(interface)。

    附带说明一下,如果您明确希望yx + some more methods,则可以这样编写:
    interface y {
        x
        b()
    }
    

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

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

    08-18 11:34
    查看更多