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结构体需要扩展功能,同时不希望破坏继承关系,则可以实现某个接口即可,因此我们可以认为,实现接口是对继承机制的补充
posted @ 2021-06-01 21:46  若雨蚂蚱  阅读(237)  评论(0编辑  收藏  举报