为了账号安全,请及时绑定邮箱和手机立即绑定

Golang OOP 说明

Golang OOP 说明

Go
大话西游666 2023-03-29 15:14:51
我有两个用 编写的接口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}我对此有几个问题,即:我说 z 实现了 x 和 y 是对的吗?以这种方式实现多个接口的一个结构的 OOP 概念是什么?我试着问了几位同事,他们似乎倾向于polymorphism作为答案,虽然他们不太确定。多态性的维基百科条目说它“是为不同类型的实体提供单一接口”,但这对我来说就像是直接相反。我还在其他来源(例如this)中发现 Go “不是真正的 OOP 语言”。
查看完整描述

4 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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


var _ x = z{}

var _ y = z{}

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


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


interface y {

    x

    b()

}

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


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


查看完整回答
反对 回复 2023-03-29
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

一开始我很难掌握 Go 接口的窍门。我有多年的 Java、C++、Python 经验……恕我直言,充分利用 Go 和任何其他新语言的最佳方法是不要用 Go 语法编写 Java 或 C++。了解 Go 中的事物是如何工作的并使用它。术语可能不是精确的一对一映射,但这无关紧要。

将 Go 接口视为一组对某些数据组(结构)进行操作的方法签名。 类似于Java 接口只是类上的一组方法签名。主要区别在于,在 Go 中,你不需要指定结构implements接口,语言会为你做。如果您在结构上指定方法,它会自动实现接口。


查看完整回答
反对 回复 2023-03-29
?
墨色风雨

TA贡献1853条经验 获得超6个赞

您说 z 实现了这两个接口是正确的。

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

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

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

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


查看完整回答
反对 回复 2023-03-29
?
慕森卡

TA贡献1806条经验 获得超8个赞

Go 中没有继承的概念。它促进了组合而不是继承。

来自 Go 常见问题解答:

没有类型层次结构:类型就是这样,它们不必声明它们的关系。这些简化使 Go 既具有表现力又易于理解,而不会牺牲复杂性。


查看完整回答
反对 回复 2023-03-29
  • 4 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信