天天看點

Golang 模拟java超類型(abstract class)的實作

   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>&amp;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,如需轉載請自行聯系原作者