Golang实现接口与继承的比较

实现接口 与 继承

  • 接口相当于继承的补充
  • 场景一:小猴子是猴子的一个子类,继承猴子的共性,同时这个小猴子学会了鸟儿的飞翔、鱼儿的游泳。
    Golang实现接口与继承的比较_第1张图片
  • 代码实现
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结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为,实现接口是对继承机制的补充
  • 场景二:篮球运动员和足球运动员继承运动员的属性字段;大学生和中学生继承学生的属性和字段;要求足球运动员和大学生掌握英语技能Golang实现接口与继承的比较_第2张图片

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 的关系。
  • 接口在一定程度上实现了代码解耦

你可能感兴趣的:(Golang学习,golang,java,开发语言)