Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang OOP澄清_Oop_Go - Fatal编程技术网

Golang OOP澄清

Golang OOP澄清,oop,go,Oop,Go,我有两个用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对吗 一个结构以

我有两个用
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概念是什么

  • 我试着问了几个同事,他们似乎倾向于
    多态性
    作为答案,尽管他们不太确定。for多态性说它“为不同类型的实体提供了一个单一的接口”,但这对我来说感觉正好相反。我还发现在其他来源(例如)中,Go“不是一种真正的OOP语言”。

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

    var _ x = z{}
    var _ y = z{}
    
    这将为您提供编译时检查,以确保类型实现了您希望它实现的接口

    作为旁注,如果您明确希望
    y
    成为
    x+一些其他方法,那么这样写是有意义的:

    interface y {
        x
        b()
    }
    
    关于命名,如果一个类型实现了两个不同的接口,它们共享一些方法,我就这样称呼它——一个实现了两个不同接口的类型。一个接口是另一个接口的子集并不重要


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

    我一开始很难掌握Go接口的诀窍。我来自爪哇多年的经验,C++,Python…最好的方法是:在GO语法中不要编写java或C++的最新语言。了解Go中的工作原理并使用它。术语可能不是精确的1对1映射,这并不重要


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

    可以正确地说z实现了两个接口

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

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

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

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

    1)是的。2) “OOP”没有100%准确清晰的定义和边界。不要陷入“让我们说出一件事并假装我们掌握了它”的游戏中。它允许多态性,因为您可以为一个函数提供多个不同类型的x(一个是youz)。