非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第12章 接口与类型
- 12.3 接口嵌入
第12章 接口与类型
12.3 接口嵌入
接口嵌入,也叫接口组合,在其他语言中,这种接口的组合叫作继承;Go语言舍弃了繁杂的继承体系,但继承这个特性还是通过接口嵌入得以实现了。【行的】
接口嵌入也就是指如果一个接口interface1作为interface2的一个嵌入字段,那么interface2隐式包含了interface1里面所有的方法,
例如动手写12.3.1
[ 动手写 12.3.1]
package main
type interface1 interface {
Method()
}
type interface2 interface {
interface1
}
接口嵌入同样体现了非侵入式的风格,关于非侵入式,后面再细说。
关于接口嵌套需要注意:首先,一个接口类型只接受其他的接口类型的嵌入,嵌入结构体或其他类型则会报错;其次,一个接口类型不能嵌入自身,这包括直接嵌入和间接嵌入。
直接嵌入如下:
[动手写 12.3.2]
package main
type interface1 interface {
interface1
}
间接嵌入如下:
[ 动手写 12.3.3]
package main
type interface1 interface {
interface2
}
type interface2 interface {
interface3
}
type interface3 interface {
interface1
}
动手写12.3.2和动手写12.3.3都会报“invalid recursive type”的错误。
我们来看一个完整的例子:
[ 动手写 12.3.4]
package main
import "fmt"
type IPerson interface {
Speak()
}
type IStudent interface {
IPerson
Study()
}
type ITeacher interface {
IPerson
Teach()
}
type Student struct {
Name string
}
func (s *Student) Speak() {
fmt.Println("My name is ", s.Name)
}
func (s *Student) Study() {
fmt.Println(s.Name, " is studying")
}
type Teacher struct {
Name string
}
func (t *Teacher) Speak() {
fmt.Println("My name is ", t.Name)
}
func (t *Teacher) Teach() {
fmt.Println(t.Name, " is teaching")
}
func main() {
var stu Student = Student{"Xiao Ming"}
var teacher Teacher = Teacher{"Mr. Li"}
stu.Speak()
stu.Study()
teacher.Speak()
teacher.Teach()
}
运行结果
动手写12.3.4定义了三个接口:IPerson、IStudent、ITeacher。
其中IStudent和ITeacher都嵌入了IPerson接口,可以理解为IStudent和ITeacher都继承了IPerson接口,都拥有了IPerson接口中的Speak()方法;而结构体Teacher要实现ITeacher接口,则同时需要实现IPerson接口才行。