歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Golang 模擬Java超類型(abstract class)的實現

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

日期:2017/3/1 9:48:52   编辑:Linux編程

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