本文最初发表在我的个人博客,查看原文,获得更好的阅读体验
在像Java这种语言中,有子类(或者继承)的概念,通过继承复用已有的功能或属性,与继承不同,Go中使用组合的方式来完成已有实现的复用,这种做法称为内嵌。具体来说,就是将已定义类型内嵌到结构体或接口中完成组合。
一 接口内嵌
接口内嵌非常简单。例如标准库中的io.Reader
和io.Writer
接口,它们的定义如下:
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
我们当然可以声明一个新的接口来显示的包含上述的Read
和Write
方法:
type ReadWriter interface {
Read(p []byte) (n int, err error)
Write(p []byte) (n int, err error)
}
但是,更好的做法是将已有的接口内嵌到新的接口中,就像标准库io.ReadWriter
所做的这样:
// ReadWriter 接口整合了 Reader 和 Writer 接口。
type ReadWriter interface {
Reader
Writer
}
现在,ReadWriter
同时拥有了Reader
和Writer
的功能。
需要注意的是,内嵌的接口中不能包含重复的方法,而且接口中只能嵌套接口。
例如以下错误示例
:
package main
import "fmt"
func main() {
fmt.Println("test")
}
type A interface {
M1()
M2()
}
type B interface {
M2()
M3(<