golang接口和继承的比较
1. 接口和继承解决的问题不同
- 继承的价值主要在于:解决代码的复用性和可维护性
- 接口的价值主要在于:设计,设计各种规范(方法),让其他自定义类型去实现这些方法
2. 接口比继承更加灵活
接口比继承更加灵活,继承满足is-a的关系,而接口只需要满足like-a的关系
3. 接口在一定程度上实现了代码解耦
4. 例子
package main
import (
"fmt"
)
// 猴子
type Monkey struct {
Name string
}
// 爬树
func (monkey Monkey) ClimbTree() {
fmt.Printf("%v生来会爬树...\n", monkey.Name)
}
// 小猴子
type LittleMonkey struct {
Monkey
}
// 鸟接口
type BirdAble interface {
Fly()
}
// 鱼接口
type FishAble interface {
Swiming()
}
// 飞翔
func (littleMonkey LittleMonkey) Fly() {
fmt.Printf("%v通过学习,学会了飞翔...\n", littleMonkey.Name)
}
// 游泳
func (littleMonkey LittleMonkey) Swiming() {
fmt.Printf("%v通过学习,学会了游泳...\n", littleMonkey.Name)
}
func main() {
littleMonkey := LittleMonkey{}
littleMonkey.Name = "孙悟空"
littleMonkey.ClimbTree()
var birdAble BirdAble = littleMonkey
birdAble.Fly()
var fishAble FishAble = littleMonkey
fishAble.Swiming()
}
输出结果:
孙悟空生来会爬树...
孙悟空通过学习,学会了飞翔...
孙悟空通过学习,学会了游泳...
说明:
- 当A结构体继承了B结构体,那么A结构体就自动继承了B结构体的字段和方法,并且可以直接使用
- 当A结构体需要扩展功能,同时不希望破坏继承关系,则可以实现某个接口即可,因此我们可以认为,实现接口是对继承机制的补充