golang教學專欄為大家一起介紹於解析Go中的多態 -無需interfacesface中的多態 -不需要interfaces,希望對需要的朋友有所幫助!
如果你想在解析Go中的多態 -無需interfaces中使用多態,但是不喜歡介面嗎?請繼續閱讀...首先,讓我們看看我們想做什麼:var dog, duck *Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack!
dog和
duck具有相同的類型(
*Animal)。每個變數都使用不同的建構子實例化,並且在
makeNoise呼叫相同方法時它們具有不同的行為 。
請點擊這裡(https://play.golang.org/p/P5Ovn_K-yyo)查看完整的程式碼該type Animal struct { makeNoiseFn func(*Animal) string name string legs int }登入後複製
Animal結構體包含
name和
legs屬性,以及一個
mkeNoiseFn屬性,這個屬性實際上是一個函數,函數接受一個
*Animal參數並傳回一個字串。
func (a *Animal) makeNoise() string { return a.makeNoiseFn(a) }
makeNoise方法實際上只是一個包裝器,該包裝器呼叫相應的動物
makenoiseFn,並將指向動物本身的指標作為其參數。
func NewDog(name string) *Animal { return &Animal{ makeNoiseFn: func(a *Animal) string { return a.name + " says woof!" }, legs: 4, name: name, } } func NewDuck(name string) *Animal { return &Animal{ makeNoiseFn: func(a *Animal) string { return a.name + " says quack!" }, legs: 4, name: name, } }
makeNoiseFn屬性分配不同的功能 。現在,該
makeNoise方法根據動物是dog還是duck而呼叫對應的函數。
不!
這篇文章旨在向您展示您可以 做什麼,而不是應該 做什麼。如果你需要實作多態,介面是更好的方法。如果使用接口,則此程式碼如下所示:
type Animal interface { makeNoise() string } type Dog struct { name string legs int } func (d *Dog) makeNoise() string { return d.name + " says woof!" } type Duck struct { name string legs int } func (d *Duck) makeNoise() string { return d.name + " says quack!" } func NewDog(name string) Animal { return &Dog{ legs: 4, name: name, } } func NewDuck(name string) Animal { return &Duck{ legs: 4, name: name, } } func main() { var dog, duck Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack! }
原文網址:https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/翻譯網址:https://learnku.com/go/t/52404#
以上是解析Go中的多態 -無需interfaces的詳細內容。更多資訊請關注PHP中文網其他相關文章!