天天看点

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,如需转载请自行联系原作者