一、基本介绍
实例具有多种形态。面向对象的三大特性,在GO语言中,多态的特征通过接口实现的,可以按照统一的接口来调用不同的实现,这时接口变量就是不同的形态.
package main
import (
"fmt"
)
type Usb interface {
Start()
Stop()
}
type Phone struct {
}
// 让Phone实现Usb接口方法
func (phone Phone) Start() {
fmt.Println("手机开始工作...")
}
func (phone Phone) Stop() {
fmt.Println("手机停止工作...")
}
type Camera struct {
}
// 让Camera实现Usb接口方法
func (camera Camera) Start() {
fmt.Println("相机开始工作...")
}
func (camera Camera) Stop() {
fmt.Println("相机停止工作...")
}
type Computer struct {
}
// 编写一个方法Working方法,接收一个Usb接口类型变量
// 只要是实现了Usb接口,(所谓实现Usb接口,就是指实现了Usb接口声明所有方法)
func (computer Computer) Working(usb Usb) { // usb变量会根据传入的实参,来判断到底是Phone还是Camera
// 通过usb接口变量来调用Start和Stop方法
usb.Start()
usb.Stop()
}
func main() {
computer := Computer{}
phone := Phone{}
computer.Working(phone)
camera := Camera{}
computer.Working(camera)
}
输出结果:
手机开始工作...
手机停止工作...
相机开始工作...
相机停止工作...
二、接口体现多态特性
-
多态参数
在前面的Usb接口案例,Usb usb,即可以接收手机变量,又可以接收相机变量,就实现了Usb接口多态 -
多态数组
package main
import (
"fmt"
)
type Usb interface {
Start()
Stop()
}
type Phone struct {
Name string
}
// 让Phone实现Usb接口方法
func (phone Phone) Start() {
fmt.Println("手机开始工作...")
}
func (phone Phone) Stop() {
fmt.Println("手机停止工作...")
}
func (phone Phone) Call() {
fmt.Println("手机可以打电话...")
}
type Camera struct {
Name string
}
// 让Camera实现Usb接口方法
func (camera Camera) Start() {
fmt.Println("相机开始工作...")
}
func (camera Camera) Stop() {
fmt.Println("相机停止工作...")
}
func main() {
var usbArr [3]Usb
usbArr[0] = Phone{"小米"}
usbArr[1] = Phone{"vivo"}
usbArr[2] = Camera{"尼康"}
for _, v := range usbArr {
v.Start()
v.Stop()
if phone, ok := v.(Phone); ok {
phone.Call()
}
}
}
输出结果:
手机开始工作...
手机停止工作...
手机可以打电话...
手机开始工作...
手机停止工作...
手机可以打电话...
相机开始工作...
相机停止工作...