GO语言使用之面向对象编程(8)面向对象三大特征之多态

一、基本介绍

变量(实例)具有多种形态。面向对象的第三大特征,在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)
}

猜你喜欢

转载自blog.csdn.net/TDCQZD/article/details/81712777