实现接口 与 继承
- 接口相当于继承的补充
- 场景一:小猴子是猴子的一个子类,继承猴子的共性,同时这个小猴子学会了鸟儿的飞翔、鱼儿的游泳。
- 代码实现
package main
import (
"fmt"
)
//Monkey结构体
type Monkey struct{
Name string
}
//声明接口
type BirdAble interface{
Flying()
}
//声明接口
type FishAble interface{
Swimming()
}
//LittleMonkey结构体,继承Monkey
type LittleMonkey struct{
Monkey //继承
}
func(monkey *Monkey)climbing(){
fmt.Println(monkey.Name, "生来会爬树")
}
//让LittleMonkey实现飞翔和游泳
func (monkey *LittleMonkey)Flying(){
fmt.Println(monkey.Name, "通过学习会飞翔......")
}
func (monkey *LittleMonkey)Swimming(){
fmt.Println(monkey.Name, "通过学习会游泳......")
}
func main(){
//创建一个LittleMonkey的实例
littlemonkey := LittleMonkey{
Monkey{
Name : "悟空",
},
}
littlemonkey.climbing()
littlemonkey.Flying()
littlemonkey.Swimming()
}
-
小结:
- 当A结构体继承了B结构体,那么A结构体就自动的继承了B结构体的字段和方法,并且可以直接使用
- 当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为,实现接口是对继承机制的补充。
-
场景二:篮球运动员和足球运动员继承运动员的属性字段;大学生和中学生继承学生的属性和字段;要求足球运动员和大学生掌握英语技能
package main
import (
"fmt"
)
//运动员和学生结构体(父类)
type Athletes struct{
Name string
}
type Student struct{
Name string
}
//声明接口
type EnglishAble interface{
EngStudying()
}
//子类
type Hoopster struct{
Athletes
}
type Footster struct{
Athletes
}
type Undergraduate struct{
Student
}
type MiddleStudent struct{
Student
}
func(athletes *Athletes)Ableing(){
fmt.Println(athletes.Name, "运动员具备运动员的能力")
}
func(student *Student)Studinging(){
fmt.Println(student.Name, "学生要努力学习......")
}
//足球运动员,大学生掌握英语能力
func (footster *Footster)EngStudying(){
fmt.Println(footster.Name, "足球运动员需要掌握英语能力")
}
func (undergraduate *Undergraduate)EngStudying(){
fmt.Println(undergraduate.Name, "大学生需要掌握英语能力")
}
func main(){
//创建对应的实例
hoopster := Hoopster{
Athletes{
Name : "姚明",
},
}
footster := Footster{
Athletes{
Name : "贝克汉姆",
},
}
hoopster.Ableing()
footster.Ableing()
footster.EngStudying()
middlestudent := MiddleStudent{
Student{
Name : "昭明",
},
}
undergraduate := Undergraduate{
Student{
Name : "悦瑶",
},
}
middlestudent.Studinging()
undergraduate.Studinging()
undergraduate.EngStudying()
}
接口和继承解决的问题不同
- 继承的价值主要在于:解决代码的复用性和可维护性
- 接口的价值主要在于:设计,设计好各种规范(方法),让其它自定义类型去实现这些方法。
- 接口比继承更加灵活,继承是满足 is a 的关系,而接口只需要满足 like a 的关系。
- 接口在一定程度上实现了代码解耦