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中实现多态性的一种方式,我也认为这也是这种情况.我纠正了!
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)
| 归档时间: |
|
| 查看次数: |
7589 次 |
| 最近记录: |