(三十五)golang--面向對象之多態

多態:變量具備多種形態,能夠用統一的接口來調用不一樣的實現。數組

接口體現多態特徵:函數

(1)多態參數:以前所講的Usb接口案例,既能夠接受手機變量,也能夠接受相機變量,就體現了usb接口的多態;spa

(2)多臺數組:code

package main

import (
    "fmt"
)

type usb interface {
    start()
    stop()
}

type phone struct {
    name string
}

func (p phone) start() {
    fmt.Println(p.name, "手機開始工做")
}

func (p phone) stop() {
    fmt.Println(p.name, "手機中止工做")
}

type camera struct {
    name string
}

func (c camera) start() {
    fmt.Println(c.name, "相機開始工做")
}

func (c camera) stop() {
    fmt.Println(c.name, "相機中止工做")
}

type computer struct {
}

func (co computer) working(usb usb) {
    usb.start()
    usb.stop()
}

func main() {
    var usbArr [3]usb
    usbArr[0] = phone{"小米"}
    usbArr[1] = phone{"vivo"}
    usbArr[2] = camera{"尼康"}
    fmt.Println(usbArr)
    for i := 0; i < len(usbArr); i++ {
        usbArr[i].start()
        usbArr[i].stop()
    }
}

 

咱們之前講到,數組是隻能存儲同一種類型的數據,利用多態數組,就能夠存儲不一樣的類型了;blog

如何將一個接口變量賦值給一個自定義類型的變量?使用類型斷言接口

 

類型斷言:因爲接口是通常類型,不知道具體類型,若是要轉成具體類型,就須要使用類型斷言;要保持原來空接口指向的數據類型和斷言的數據類型一致;string

 

爲了不輸出panic報錯,能夠進行斷言判斷;it

類型斷言實踐一:class

咱們給phone中加入一個方法call(),在調用usb變量時,usb.call(),確定是不對的,由於usb多是phone,也多是camera,而camera是沒有這個函數的,所以,在調用的時候用類型斷言。import

package main

import (
    "fmt"
)

type usb interface {
    start()
    stop()
}

type phone struct {
    name string
}

func (p phone) start() {
    fmt.Println(p.name, "手機開始工做")
}

func (p phone) call() {
    fmt.Println(p.name,"手機在打電話")
}

func (p phone) stop() {
    fmt.Println(p.name, "手機中止工做")
}

type camera struct {
    name string
}

func (c camera) start() {
    fmt.Println(c.name, "相機開始工做")
}

func (c camera) stop() {
    fmt.Println(c.name, "相機中止工做")
}

type computer struct {
}

func (co computer) working(usb usb) {
    usb.start()
    //若是usb還指向phone的結構體變量,則還須要調用call方法
    if phone, ok := usb.(phone); ok { phone.call() }
    usb.stop()
}

func main() {
    var usbArr [3]usb
    usbArr[0] = phone{"小米"}
    usbArr[1] = phone{"vivo"}
    usbArr[2] = camera{"尼康"}
    var com computer
    fmt.Println(usbArr)
    for i := 0; i < len(usbArr); i++ {
        com.working(usbArr[i])
    }
}

 

類型斷言實踐2:循環判斷輸入參數的類型

package main

import (
    "fmt"
)

type student struct {
    name string
}

func typeJudge(items ...interface{}) {
    for index, x := range items {
        switch x.(type) {
        case bool:
            fmt.Printf("第%v個參數是bool類型,值是%v\n", index, x)
        case int, int32, int64:
            fmt.Printf("第%v個參數是整數類型,值是%v\n", index, x)
        case float32:
            fmt.Printf("第%v個參數是float32類型,值是%v\n", index, x)
        case float64:
            fmt.Printf("第%v個參數是float64類型,值是%v\n", index, x)
        case string:
            fmt.Printf("第%v個參數是string類型,值是%v\n", index, x)
        case student:
            fmt.Printf("第%v個參數是student類型,值是%v\n", index, x)
        case *student:
            fmt.Printf("第%v個參數是*student類型,值是%v\n", index, x)
        default:
            fmt.Printf("第%v個參數類型不肯定,值是%v\n", index, x)
        }
    }
}

func main() {
    var n1 float32 = 1.1
    var n2 float64 = 1.2
    var n3 int32 = 1
    var name string = "tom"
    var n5 bool = true

    stu1 := student{"jack"}
    stu2 := &student{"bob"}

    typeJudge(n1, n2, n3, name, n5, stu1, stu2)
}

相關文章
相關標籤/搜索