首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Golang OOP澄清

Golang OOP澄清
EN

Stack Overflow用户
提问于 2018-08-30 03:16:33
回答 4查看 673关注 0票数 2

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

代码语言:javascript
运行
复制
type x interface {
    a()
}

type y interface {
    a()
    b()
}

我还有一个具有如下方法的结构

代码语言:javascript
运行
复制
type z struct {
    some string
}

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

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

我对此有几个问题,即:

  1. 我说得对吗,z同时实现了x和y?
  2. 以这种方式实现多个接口的一个结构的OOP概念是什么?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-30 04:27:19

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

代码语言:javascript
运行
复制
var _ x = z{}
var _ y = z{}

这将为您提供一个编译时间检查,以确保某个类型实现了您希望它实现的接口。

顺便提一句,如果您明确希望y成为x + some more methods,那么将它写成这样是有意义的:

代码语言:javascript
运行
复制
interface y {
    x
    b()
}

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

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

票数 7
EN

Stack Overflow用户

发布于 2018-08-30 04:40:06

一开始,我很难掌握Go接口的窍门。我来自爪哇,C++,Python的多年经验.IMHO最大限度地利用Go和任何其他新语言的最佳方法是不使用Go语法编写Java或C++。了解事物是如何运作的,并加以利用。术语可能不是精确的1到1映射,这并不重要。

将Go接口看作一组在某些数据组(struct)上操作的方法签名。类似于Java接口只是类上的一组方法签名。主要的区别是,在Go中,您不需要指定结构implements (一个接口),语言将为您完成这一任务。如果在结构上指定方法,它将自动实现接口。

票数 2
EN

Stack Overflow用户

发布于 2018-08-30 04:42:45

您正确地说,z实现了这两个接口。

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

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

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

Go是一种强类型语言,接口允许Go程序员通过其方法定义类型,以及通过数据结构定义类型的其他方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52088759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档