golang中無繼承概念,但利用golang匿名組合即可實作面向對象程式設計中繼承的效果。在面向對象程式設計中,一般常見的兩種超類型:接口,抽象類。在golang中,則更精簡為隻包含接口。在設計模式中,有要面向接口(超類型)程式設計這一重要的設計原則。在某些場合,抽象類比接口更便捷。但這不代表就必須使用抽象類,抽象類可用一般類組合接口來代替實作相應的效果。
下面就用golang接口來模拟java抽象類的實作。
java代碼:
1
2
3
4
5
6
7
8
9
10
11
12
<code>public</code> <code>abstract</code> <code>class</code> <code>PizzaStore {</code>
<code> </code><code>public</code> <code>Pizza orderPizza(String items) {</code>
<code> </code><code>Pizza pizza;</code>
<code> </code><code>pizza = createPizza(items);</code>
<code> </code><code>pizza.prepare();</code>
<code> </code><code>pizza.bake();</code>
<code> </code><code>pizza.cut();</code>
<code> </code><code>pizza.box();</code>
<code> </code><code>return</code> <code>pizza;</code>
<code> </code><code>}</code>
<code> </code><code>protected</code> <code>abstract</code> <code>Pizza createPizza(String items);</code>
<code>}</code>
對應go代碼:其中pizza.PizzaProduct相對應為java中傳回的Pizza對象
13
14
15
16
17
<code>type pizzaSaler </code><code>interface</code> <code>{</code>
<code> </code><code>OrderPizza(</code><code>string</code><code>) pizza.PizzaProduct</code>
<code> </code><code>createPizza(</code><code>string</code><code>) pizza.PizzaProduct</code>
<code> </code>
<code>type pizzaStore </code><code>struct</code> <code>{</code>
<code> </code><code>psaler pizzaSaler</code>
<code> </code>
<code>func (</code><code>this</code> <code>*pizzaStore) OrderPizza(items </code><code>string</code><code>) pizza.PizzaProduct {</code>
<code> </code><code>onePizza := </code><code>this</code><code>.psaler.createPizza(items)</code>
<code> </code><code>onePizza.Prepare()</code>
<code> </code><code>onePizza.Bake()</code>
<code> </code><code>onePizza.Cut()</code>
<code> </code><code>onePizza.Box()</code>
<code> </code><code>return</code> <code>onePizza</code>
golang的接口為非侵入式接口,為實作繼承效果,pizzaStore子類應組合pizzaStore,并實作pizzaSaler的兩個函數(OrderPizza方法已在父類PizzaStore實作,是以隻要實作CreatePizza方法即可),把子類自身指派給父類的psaler字段,這就類似與抽象類的子類必須實作抽象類(父類)中的抽象方法:
18
19
<code>type NYPizzaStore struct {</code>
<code> </code><code>pizzaStore</code>
<code> </code>
<code>func (</code><code>this</code> <code>*NYPizzaStore) createPizza(items string) pizza.PizzaProduct {</code>
<code> </code><code>if</code> <code>items == </code><code>"cheese"</code> <code>{</code>
<code> </code><code>return</code> <code>pizza.NewNYStyleCheesePizza()</code>
<code> </code><code>} </code><code>else</code> <code>if</code> <code>items == </code><code>"veggie"</code> <code>{</code>
<code> </code><code>return</code> <code>pizza.NewNYStyleVeggiePizza()</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>return</code> <code>nil</code>
<code> </code>
<code>func NewNYPizzaStore() pizzaSaler {</code>
<code> </code><code>//golang無構造函數,故用此法建立執行個體并初始化</code>
<code> </code><code>return</code> <code>&NYPizzaStore{pizzaStore: pizzaStore{</code><code>new</code><code>(NYPizzaStore)}}</code>
<code> </code><code>//new(NYPizzaStore)将子類自身指派給父類的pizzaSaler接口字段</code>
本文轉自 ponpon_ 51CTO部落格,原文連結:http://blog.51cto.com/liuxp0827/1353140,如需轉載請自行聯系原作者