1.基本介绍
变量(实例)具有多种形态,面向对象的第三大特征,在 go语言,多态特征是通过接口实现的,可以按照统一的接口来调用不同的实现,这时接口变量就呈现不同的形态
package main
import(
"fmt"
)
// 声明一个接口
type Usb interface {
//声明了两个没有实现的方法
Start()
Stop()
}
//声明一个结构体,实现Usb方法
type Phone struct{
}
func (p Phone) Start() {
fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作...")
}
//相机实现Usb方法
type Camera struct{
}
func (c Camera) Start() {
fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作...")
}
//计算机
type Computer struct{
}
//编写一个方法Working, 接收一个Usb接口类型变量
//实现了Usb接口(就是指实现了Usb接口声明的所有方法)
func (c Computer) Working(usb Usb) {//usb变量会根据传入的实参,来判断到底是Phone,还是Camera
//通过Usb接口变量来调用Start,Stop方法
usb.Start()
usb.Stop()
}
func main() {
//先创建结构体变量
computer := Computer{}
phone := Phone{}
camera := Camera{}
//关键点
computer.Working(phone)
computer.Working(camera)
}
手机开始工作...
手机停止工作...
相机开始工作...
相机停止工作...
2.接口体现多态的两种形式
多态参数
在前面的 Usb 接口案例, Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口多态
多态数组
演示一个案例:给 Usb 数组中,存放 Phone 结构体和 Camera 结构体变量
package main
import(
"fmt"
)
// 声明一个接口
type Usb interface {
//声明了两个没有实现的方法
Start()
Stop()
}
//声明一个结构体,实现Usb方法
type Phone struct{
Name string
}
func (p Phone) Start() {
fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作...")
}
//相机实现Usb方法
type Camera struct{
Name string
}
func (c Camera) Start() {
fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作...")
}
//计算机
type Computer struct{
}
//编写一个方法Working, 接收一个Usb接口类型变量
//实现了Usb接口(就是指实现了Usb接口声明的所有方法)
func (c Computer) Working(usb Usb) {
//通过Usb接口变量来调用Start,Stop方法
usb.Start()
usb.Stop()
}
func main() {
//定义一个Usb接口数组,可以存放Phone,Camera的结构体变量
//体现多态数组
var usbArr [3]Usb
usbArr[0] = Phone{"华为"}
usbArr[1] = Phone{"小米"}
usbArr[2] = Camera{"相机"}
fmt.Println(usbArr)
}