在Golang中實現多型
阿新 • • 發佈:2021-11-28
和流行的面嚮物件語言不同,go 中沒有面向物件的說法,也沒有對應的封裝、繼承和多型,但是,沒有不表示 go 不能,我們仍然可以拐著彎地去使用
目錄
1、說明
和流行的面嚮物件語言不同,go 中沒有面向物件的說法,也沒有對應的封裝、繼承和多型,也許 go 的設計就不是和OOP對齊,想使用OOP,那就去用 Java 或者 C++ 吧。
但是,沒有不表示 go 不能,我們仍然可以拐著彎地去使用
比如封裝,可以用結構體模擬;繼承可以使用介面和巢狀結構體,多型有些麻煩,前兩者結合也可以實現
2、多型
程式設計中有一種風格鴨式辯型,javascript 裡面常用,大概意思就是,走路像鴨子,叫起來像鴨子,那麼它就是一隻鴨子
把它放到 go 中,儘管沒有多型,但是能實現多型相同的用法,那它就是多型
3、程式碼示例
我們用手機舉例子,現在有多款手機,都能打電話(call()),但是打電話的內容不同,我們要能實現動態地切換不同手機打電話
放在 C++/java 中,這個功能很容易實現,只需要建立一個基類 Phone,然後不同手機的子類繼承 Phone,實現 call() 方法即可,go 中,使用以下方式實現
示例:
type PhoneData struct {
name string
}
type Phone interface {
call()
}
Phone 定義介面,後面需要實現這個介面,PhoneData 則表示各個手機都有的屬性(這裡是name)
type IPhone struct { PhoneData } func (phone *IPhone) call() { fmt.Printf("%s call\n", phone.name) }
定義 IPhone,實現 call() 方法
type HWPhone struct {
PhoneData
}
func (phone *HWPhone) call() {
fmt.Printf("%s call", phone.name)
}
定義 HWPhone,實現 call() 方法
func getPhone(name string) Phone { switch name { case "iphone": phone := new(IPhone) phone.name = "iphone" return phone case "hwphone": phone := new(HWPhone) phone.name = "hwphone" return phone default: fmt.Println("no phone") } return nil }
物件工廠,根據引數,獲取不同的手機
func main() {
var phone Phone
phone = getPhone("hwphone")//輸出hwphone call
phone.call()
}
呼叫處,這裡的的 phone 變數執行的 call() 方法,可以能是 IPhone,也可能是 HWPhone 的
4、總結
每種語言都有它的優勢和劣勢,go 可能設計之初就不是基於 OOP,強行按照 OOP 的思路寫 go 到底是正途還是歪門邪道,我也不知道。寫慣了 OOP 的人,即使換一種語言總喜歡用 OOP 的思路去套用,果然,思維的轉換才是最難的
還是需要學習啊!!!