下面由golang教程欄目給大家介紹Go中的多態(tài) -無需interfaces,希望對需要的朋友有所幫助!
如果你想在Go中使用多態(tài),但是不喜歡接口嗎?請繼續(xù)閱讀…
首先,讓我們看看我們想做什么:
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
)。每個變量都使用不同的構(gòu)造函數(shù)實例化,并且在makeNoise
調(diào)用相同方法時它們具有不同的行為 。
通常,這個例子是我們使用接口的目的,但我們不希望實際使用是這么簡單。
讓我們看看如何使這項工作:
請點擊這里(https://play.golang.org/p/P5Ovn_K-yyo)查看完整的代碼
type Animal struct { makeNoiseFn func(*Animal) string name string legs int }
該Animal
結(jié)構(gòu)體包含name
和legs
屬性,以及一個mkeNoiseFn
屬性,這個屬性實際上是一個函數(shù),函數(shù)接受一個*Animal
參數(shù)并返回一個字符串。
func (a *Animal) makeNoise() string { return a.makeNoiseFn(a) }
makeNoise
方法實際上只是一個包裝器,該包裝器調(diào)用相應(yīng)的動物makenoiseFn
,并將指向動物本身的指針作為其參數(shù)。
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, } }
現(xiàn)在,我們要做的就是讓同一個類型表現(xiàn)出不同的行為,并為其makeNoiseFn
屬性分配不同的功能 ?,F(xiàn)在,該makeNoise
方法根據(jù)動物是dog還是duck而調(diào)用對應(yīng)的函數(shù)。
我應(yīng)該這樣做嗎?
不!
這篇文章旨在向您展示您 可以 做什么,而不是 應(yīng)該 做什么 。如果你需要實現(xiàn)多態(tài),接口是一種更好的方法。如果使用接口,則此代碼如下所示:
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