(三十五)golang–面向對象之多態
多態:變量具有多種形態,可以用統一的接口來調用不同的實現。
接口體現多態特徵:
(1)多態參數:之前所講的Usb接口案例,既可以接受手機變量,也可以接受相機變量,就體現了usb接口的多態;
(2)多態數組:
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() } }
我們以前講到,數組是只能存儲同一種類型的數據,利用多態數組,就可以存儲不同的類型了;
如何將一個接口變量賦值給一個自定義類型的變量?使用類型斷言
類型斷言:由於接口是一般類型,不知道具體類型,如果要轉成具體類型,就需要使用類型斷言;要保持原來空接口指向的數據類型和斷言的數據類型一致;
為了避免輸出panic報錯,可以進行斷言判斷;
類型斷言實踐一:
我們給phone中加入一個方法call(),在調用usb變量時,usb.call(),肯定是不對的,因為usb可能是phone,也可能是camera,而camera是沒有這個函數的,因此,在調用的時候用類型斷言。
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) }
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!