image.png
接口和继承 - 图2

接口与继承的关系

  1. 接口是对继承的补充
  2. 接口和继承解决的问题不同
    1. 继承:解决代码的复用性和可维护性
    2. 接口:设计好各种规范(方法),让其它自定义类型去实现这些方法
  3. 接口比继承更加灵活
    1. 继承满足 is - a 的关系
    2. 接口满足 like - a 的关系
  4. 接口在一定程度上实现代码解耦

    代码

    ```go package main

import ( “fmt” )

type Monkey struct { Name string }

// 声明接口 type BirdAble interface { Flying() } type FishAble interface { Swimming() }

func (monkey *Monkey) climping() { fmt.Printf(“猴子:%v, 天生会爬树 \n”, monkey.Name) }

// 小猴子继承了老猴子会爬树的技能 // 小猴子天赋异禀学会了老猴子不会的飞行技能, 以及游泳技能 // 不能破坏老猴子的属性方法,所以需要接口来对继承做补充 type LittleMonkey struct { Monkey }

func (littleMonkey LittleMonkey) Flying() { fmt.Printf(“名字:%v, 通过学习,会飞了!!! \n”, littleMonkey.Name) } func (littleMonkey LittleMonkey) Swimming() { fmt.Printf(“名字:%v, 通过学习,会游泳了!!! \n”, littleMonkey.Name) }

func main() { monkey := LittleMonkey{ Monkey{ Name: “悟空”, }, } monkey.climping() // 实现了接口的行为,但是并没有采用接口的调用方式 // 如下这样仅仅是调用结构体绑定的方法 / monkey.Flying() monkey.Swimming() /

  1. // 调用接口
  2. fly(monkey)
  3. swim(monkey)

} func fly(bird BirdAble) { bird.Flying() }

func swim(fish FishAble) { fish.Swimming() }

```

代码分析

  1. 当A结构体继承了B结构体,A就自动继承了B的字段和方法,可以直接使用
  2. 这时候,当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口

实现接口是对继承的补充