Golang
Go语言面向对象编程三大特征 - 多态
11-19 10:39在Go语言中,多态是通过接口实现的
变量(实例)具有多种形态,面向对象的第三大特征,
可以按照统一的接口来调用不同的实现,这时接口变量就呈现不同的形态。
比如下面的 Usb 接口案例
//定义(声明)一个 Usb 接口,抽象出通过Usb接口可以做的事情
type Usb interface {
Start()
}
//定义 Phone 类型,让 Phone 实现 Usb 接口的方法
type Phone struct { }
func (phone Phone) Start() {
fmt.Println("手机开始工作...")
}
//定义 Camera 类型,让 Camera 实现 Usb 接口的方法
type Camera struct {}
func (camera Camera) Start() {
fmt.Println("相机开始工作...")
}
//编写一个 Working 方法,接收一个 Usb 接口类型的变量
type Computer struct { }
//usb 变量会根据传入的实参,判断到底时 Phone 还是 Camera(体现出多态的特点)
func (computer Computer) Working(usb Usb) {
usb.Start()
}
func main() {
//创建结构体变量
var phone Phone{}
camera := Camera
computer := new(Computer)
//Working方法中的usb变量,会根据传入的实参,调用对应类型中的方法
computer.Working(phone)
computer.Working(camera)
}
下面的代码重点体现多态的特点

接口体现多态的两种形式
多态参数
比如上面的 Usb 接口案例,usb Usb 既可以接收手机变量,又可以接收相机变量,这就体现了 Usb 接口多态
多态数组
案例演示:同样是上面的 Usb 接口案例,定义一个 Usb 接口数组,可以存放多个结构体变量(体现多态数组)
//定义(声明)一个 Usb 接口,抽象出通过Usb接口可以做的事情
type Usb interface {
Start()
}
//定义 Phone 类型,让 Phone 实现 Usb 接口的方法
type Phone struct { }
func (phone Phone) Start() {
fmt.Println("手机开始工作...")
}
//定义 Camera 类型,让 Camera 实现 Usb 接口的方法
type Camera struct {}
func (camera Camera) Start() {
fmt.Println("相机开始工作...")
}
//编写一个 Working 方法,接收一个 Usb 接口类型的变量
type Computer struct { }
//usb 变量会根据传入的实参,判断到底时 Phone 还是 Camera(体现出多态的特点)
func (computer Computer) Working(usb Usb) {
usb.Start()
}
func main() {
//定义一个 Usb 接口数组,可以存放 Phone 和 Camera 结构体变量(体现多态数组)
var usbArr = [3]Usb{
Phone{"OPPO"},
Phone{"Vivo"},
Camera{"Nikon"},
}
fmt.Println(usbArr)
}
重点看末尾的接口数组,可以体现出多态数组