Golang:当你有多个继承权时,接口的重点是什么

tld*_*ldr 1 java inheritance interface multiple-inheritance go

我是一名Java程序员,学习在Go中编程.到目前为止,我非常喜欢这种语言.比Java更多.

但有一件事我有点困惑.Java具有接口,因为类只能从一个类继承.由于Go允许多重继承,接口的重点是什么?

tld*_*ldr 11

多态性

接口使函数具有"占位符"参数,该参数可以将不同的结构作为参数.例如,如果结构Man,Woman,Child实现接口Human,那么带参数Human的方法可以将任何结构Man,Woman,Child作为参数.因此,只要接口参数实现了接口中定义的所有函数,接口参数就可以"变形"为作为参数传递的任何结构.

这很重要,因为接口是在Go中实现多态性的唯一方法,因为它没有继承.因此,如果Man'扩展'Human(通过将其作为匿名字段),任何使用Human作为参数的方法都不能将Man作为参数.

我的困惑源于这样一个事实,即继承也是在Java中实现多态性的一种方式,我也认为这也是这种情况.我纠正了!


Luk*_*uke 9

Go中的接口与Java中的接口非常不同.

在Java中,类必须正式同意实现接口:

public class Foo implements iFoo
Run Code Online (Sandbox Code Playgroud)

在Go中,用户类型通过简单地实现接口.

然后,函数或属性可以定义预期的内容:

func DoSomething(r io.Reader) {
    buf := make([]byte, 128)
    n, err := r.Read(buf)
    ...
}
Run Code Online (Sandbox Code Playgroud)

DoSomething函数可以传递任何实现接口中Read找到的函数io.Reader东西,而不需要知道或关心接口.这是来电者的责任,以确保它传递的东西实现接口.这在编译时检查.

我们可以更进一步.我们可以定义自己的界面:

type MyInterface interface {
    io.Reader // Include Reader interface
    Seek(int) error // Include my own function
}
func DoSomething(r MyInterface) {
    buf := make([]byte, 128)
    n, err := r.Read(buf)
    ...
}
Run Code Online (Sandbox Code Playgroud)

Go也有所不同,因为它没有对象类型.任何用户声明的类型,无论是基于整数,字符串,结构,数组,切片,通道等,都可以附加方法.

Go也没有你通常习惯的典型类继承,但它确实有一些非常接近的东西.

Redeclared类型:

type Num int

func (n Num) Print() {
    print(n)
}

type Number Num

func (n Number) Print() {
    Num(n).Print()
}
Run Code Online (Sandbox Code Playgroud)

匿名字段:

type Foo struct {
    sync.Mutex
}

func main() {
    f := Foo{}
    f.Lock()
    // ...
    f.Unlock()
}
Run Code Online (Sandbox Code Playgroud)