golang技術隨筆(一)深入理解interface
阿新 • • 發佈:2019-01-24
type IPizzaCooker interface { Prepare(*Pizza) Bake(*Pizza) Cut(*Pizza) } func cookOnePizza(ipc IPizzaCooker) *Pizza { p := new(Pizza) ipc.Prepare(p) ipc.Bake(p) ipc.Cut(p) return p } type PizzaDefaultCooker struct { } func (this *PizzaDefaultCooker) CookOnePizza() *Pizza { return cookOnePizza(this) } func (this *PizzaDefaultCooker) Prepare(*Pizza) { //....default prepare pizza } func (this *PizzaDefaultCooker) Bake(*Pizza) { //....default bake pizza } func (this *PizzaDefaultCooker) Cut(*Pizza) { //....default cut pizza } type MyPizzaCooker struct { PizzaDefaultCooker } func (this *MyPizzaCooker) CookOnePizza() *Pizza { return cookOnePizza(this) } func (this *MyPizzaCooker) Bake(*Pizza) { //....bake pizza use my style } func main() { var cooker MyPizzaCooker p := cooker.CookOnePizza() //.... }
由於golang的多型必須藉助介面來實現,這實際上已不是嚴格意義上的依賴倒置了,在這個例子中golang顯得有些笨拙,它其實完全可以有更優雅的實現方案,舉這個例子只是為了給大家介紹多型在golang中的實現方式,以及所謂模擬繼承並不等價於面向物件中的繼承關係。