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