一、基本介绍
变量(实例)具有多种形态。面向对象的第三大特征,在Go语言,多态特征是通过接口实现的。可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。
二、快速入门
在前面的Usb接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了Usb 接口 多态特性。
type phone struct{
name string
}
type camera struct{
name string
}
type camputer struct{
}
func (c camputer) working(usb Usb) {
usb.boot()
usb.shutdown()
usb.charging()
}
type Usb interface {
charging()
boot()
shutdown()
}
//实现接口
func (p phone) charging(){
fmt.Printf("%s手机开始充电。。。。\n",p.name)
}
func (p phone) boot(){
fmt.Printf("%s手机正在开机。。。。\n",p.name)
}
func (p phone) shutdown(){
fmt.Printf("%s手机关机了。。。。\n",p.name)
}
func (c camera) charging(){
fmt.Printf("%s相机开始充电。。。。\n",c.name)
}
func (c camera) boot(){
fmt.Printf("%s相机正在开机。。。。\n",c.name)
}
func (c camera) shutdown(){
fmt.Printf("%s相机关机了。。。。\n",c.name)
}
//多态参数
func PloymDemo() {
p := phone{"小米"}
c := camera{"尼康"}
cap := camputer{}
cap.working(p)
cap.working(c)
}
//多态数组
func PloymDemo1() {
var usbArr [4]Usb
usbArr[0] = phone{"vivo"}
usbArr[1] = camera{"尼康"}
usbArr[2] = phone{"小米"}
usbArr[3] = camera{"索尼"}
fmt.Println("usbArr=", usbArr)
//遍历usbArr,调用方法
for i := 0; i < len(usbArr); i++ {
usbArr[i].charging()
usbArr[i].boot()
usbArr[i].shutdown()
}
}
三、接口体现多态特征
1、多态参数
在前面的Usb接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了Usb 接口 多态
2、 多态数组
演示一个案例:给Usb数组中,存放 Phone 结构体 和 Camera结构体变量,Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量,除了调用Usb 接口声明的方法外,还需要调用Phone 特有方法 call. =》类型断言
/*最佳实践1*/
//类型断言使用
func (p phone) call(){
fmt.Printf("%s手机正在通话。。。。\n",p.name)
}
func (c camputer) working1(usb Usb) {
// 开始使用类型断言来调用Phone特有的方法Call
ps ,yes :=usb.(phone)
if yes {
ps.call()
}
usb.boot()
usb.shutdown()
usb.charging()
}
func TypeAssertion1() {
p := phone{"小米"}
c := camera{"尼康"}
cap := camputer{}
cap.working1(p)
cap.working1(c)
}