多态划重点
1、定义一个接口,里面设计好需要的接口,可以有多个。
2、任何实现了这个接口的类型,都可以赋值给这个接口,从而实现多态。
3、多个类之间,不需要有继承关系。
4、如果接口中定义了多个接口,那么实际类必须全部实现接口函数,才可以赋值。
代码
package main
import "fmt"
/*
一、
C语言的多态:需要父子关系
GO语言多态:不需要继承,只要实现相同的接口即可
二、
实现多态,首先需要定义接口。
我们这里创建一个人:人的武器发起攻击,不同等级武器效果不同。
*/
// IAttack 1、创建一个接口,类型是interface
type IAttack interface {
// Attack1 接口的函数,(接口函数可以多个,但只可以有原型,不可以有实现。)
Attack1()
Attack2()
//Attack3()
}
// HumanLowLevel 2、低等级结构体
type HumanLowLevel struct {
name string
level int
damage int
}
// HumanHiLevel 2-1、高等级结构体
type HumanHiLevel struct {
name string
level int
damage int
}
// Attack1 3-1、绑定方法
func (a *HumanLowLevel) Attack1() {
fmt.Println("这个来自霍比特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}
// Attack2 3-2、绑定方法
func (a *HumanLowLevel) Attack2() {
fmt.Println("这个来自比尔吉沃特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}
// Attack1 3-3、绑定方法
func (a *HumanHiLevel) Attack1() {
fmt.Println("这个来自霍比特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}
// Attack2 3-4、绑定方法
func (a *HumanHiLevel) Attack2() {
fmt.Println("这个来自比尔吉沃特的人是:", a.name, "等级:", a.level, "伤害:", a.damage)
}
/*
我们进一步简化:
定义一个堕胎的通用接口,传入不同的对象,调用同样的方法,实现不同效果。 => 多态
*/
func DoAttack(a IAttack) {
a.Attack1()
a.Attack2()
}
func main() {
lowLevel := HumanLowLevel{
name: "大潘儿",
level: 1,
damage: 1000,
}
hiLevel := HumanHiLevel{
name: "大嫚儿",
level: 10,
damage: 100000,
}
// 调用
fmt.Println("========== 通过方法直接调用 ==========")
lowLevel.Attack1()
hiLevel.Attack2()
/*
定义一个包含Attack的接口变量
*/
fmt.Println("========== 通过接口进行调用 ==========")
// 同样一个接口player,赋值不同的对象(这里是不同方法),结果/效果不同。这就是多态。
var player IAttack
// player赋值为lowLevel,接口需要指针类型来赋值
player = &lowLevel
// 调用
player.Attack1()
player.Attack2()
// player赋值为hiLevel,接口需要指针类型来赋值
player = &hiLevel
// 调用
player.Attack1()
player.Attack2()
fmt.Println("========== (最终方式)通过接口进行调用 ==========")
DoAttack(&lowLevel)
DoAttack(&hiLevel)
}
结果
ASUS@DESKTOP-NFP9SLA MINGW64 /c/gowork/src
$ go run 013_polymorphism.go
========== 通过方法直接调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
========== 通过接口进行调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自霍比特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000
========== (最终方式)通过接口进行调用 ==========
这个来自霍比特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自比尔吉沃特的人是: 大潘儿 等级: 1 伤害: 1000
这个来自霍比特的人是: 大嫚儿 等级: 10 伤害: 100000
这个来自比尔吉沃特的人是: 大嫚儿 等级: 10 伤害: 100000