在Golang中實現多態


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 的思路去套用,果然,思維的轉換才是最難的

還是需要學習啊!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM