1. 程式人生 > >golang技術隨筆(一)深入理解interface

golang技術隨筆(一)深入理解interface

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中的實現方式,以及所謂模擬繼承並不等價於面向物件中的繼承關係。