歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Golang 模擬Java超類型(abstract class)的實現

golang中無繼承概念,但利用golang匿名組合即可實現面向對象程序設計中繼承的效果。在面向對象程序設計中,一般常見的兩種超類型:接口,抽象類。在golang中,則更精簡為只包含接口。在設計模式中,有要面向接口(超類型)編程這一重要的設計原則。在某些場合,抽象類比接口更便捷。但這不代表就必須使用抽象類,抽象類可用一般類組合接口來代替實現相應的效果。

下面就用golang接口來模擬java抽象類的實現。

java代碼:

public abstract class PizzaStore {
    public Pizza orderPizza(String items) {
        Pizza pizza;
        pizza = createPizza(items);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
    protected abstract Pizza createPizza(String items);
}

對應go代碼:其中pizza.PizzaProduct相對應為java中返回的Pizza對象
type pizzaSaler interface {
    OrderPizza(string) pizza.PizzaProduct
    createPizza(string) pizza.PizzaProduct
}
                                                                       
type pizzaStore struct {
    psaler pizzaSaler
}
                                                                                   
func (this *pizzaStore) OrderPizza(items string) pizza.PizzaProduct {
    onePizza := this.psaler.createPizza(items)
    onePizza.Prepare()
    onePizza.Bake()
    onePizza.Cut()
    onePizza.Box()
    return onePizza
}

  golang的接口為非侵入式接口,為實現繼承效果,pizzaStore子類應組合pizzaStore,並實現pizzaSaler的兩個函數(OrderPizza方法已在父類PizzaStore實現,所以只要實現CreatePizza方法即可),把子類自身賦值給父類的psaler字段,這就類似與抽象類的子類必須實現抽象類(父類)中的抽象方法:

type NYPizzaStore struct {
    pizzaStore
}
                                                     
func (this *NYPizzaStore) createPizza(items string) pizza.PizzaProduct {
    if items == "cheese" {
        return pizza.NewNYStyleCheesePizza()
    } else if items == "veggie" {
        return pizza.NewNYStyleVeggiePizza()
    } else {
        return nil
    }
}
                                                                 
func NewNYPizzaStore() pizzaSaler {
    //golang無構造函數,故用此法建立實例並初始化
    return &NYPizzaStore{pizzaStore: pizzaStore{new(NYPizzaStore)}}
    //new(NYPizzaStore)將子類自身賦值給父類的pizzaSaler接口字段
}

Copyright © Linux教程網 All Rights Reserved