Golang OOP澄清

问题描述 投票:2回答:3

我有两个用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作为答案,尽管他们不太确定。 wikipedia entry for polymorphism说它“是为不同类型的实体提供单一接口”,但这感觉就像直接反向我。我还在其他来源(例如this)中发现Go“不是真正的OOP语言”。

oop go
3个回答
7
投票

是的,z同时实施xy。您可以通过使用变量声明来为接口类型指定具体类型来证明:

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

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

作为旁注,如果你明确地希望yx + some more methods,那么写它是这样的:

interface y {
    x
    b()
}

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

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


1
投票

我一开始很难掌握Go接口的问题。我来自Java,C ++,Python的多年经验......最好的方法是恕我直言,以及任何其他新语言不是用Go语法编写Java或C ++。了解Go中的工作原理并使用它。术语可能不是精确的一对一映射,这无关紧要。

将Go接口视为在一组数据(结构)上运行的一组方法签名。类似于Java接口只是一类方法签名的集合。主要区别在于,在Go中,您不需要指定struct implements是一个接口,该语言将为您做到这一点。如果在结构上指定方法,它会自动实现该接口。


0
投票

你说z实现两个接口都是对的。

接口本身就是一种通用的编程概念,对于面向对象的语言而言并不是空间。一些面向对象的语言(如Java和Go)提供了一种定义和实现接口的方法,而其他语言则没有。

它实际上是一种多态,因为您说一组特定的函数或方法可能由不同的数据结构类型实现。正如维基百科的文章所暗示的那样。它也可以被认为是类型抽象。

Go能够支持面向对象和面向程序的编程风格。它被认为是面向对象的编程语言。

Go是一种强类型语言,除了通过数据结构定义类型的另一种方式之外,接口允许Go程序员通过他们的方法定义类型。

© www.soinside.com 2019 - 2024. All rights reserved.