Golang 模拟java超类型(abstract class)的实现

简介:

   golang中无继承概念,但利用golang匿名组合即可实现面向对象程序设计中继承的效果。在面向对象程序设计中,一般常见的两种超类型:接口,抽象类。在golang中,则更精简为只包含接口。在设计模式中,有要面向接口(超类型)编程这一重要的设计原则。在某些场合,抽象类比接口更便捷。但这不代表就必须使用抽象类,抽象类可用一般类组合接口来代替实现相应的效果。

   下面就用golang接口来模拟java抽象类的实现。

   java代码:

1
2
3
4
5
6
7
8
9
10
11
12
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对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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字段,这就类似与抽象类的子类必须实现抽象类(父类)中的抽象方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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接口字段
}









本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1353140,如需转载请自行联系原作者
目录
相关文章
|
29天前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
25 0
|
1月前
|
Java
java中的泛型类型擦除
java中的泛型类型擦除
13 2
|
1月前
|
存储 安全 Java
Java 程序员极速上手 go
Java 程序员极速上手 go
30 0
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
【Java每日一题】——第四十三题:编程用多态实现打印机.。分为黑白打印机和彩色打印机,不同类型的打印机打印效果不同。
23 0
|
1月前
|
存储 Java
JAVA字符串与其他类型数据的转换
JAVA字符串与其他类型数据的转换
27 4
|
1月前
|
存储 Java fastjson
Java泛型-4(类型擦除后如何获取泛型参数)
Java泛型-4(类型擦除后如何获取泛型参数)
33 1
|
1月前
|
Shell
Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
【2月更文挑战第17天】Flume【问题记录 01】【at org.apache.flume.node.Application.main(Application.java:xxx) 类问题整理+其他类型问题总结】【避坑指南】
53 2
|
1天前
|
存储 Java
JAVA变量类型
JAVA变量类型
7 0
|
6天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
6天前
|
存储 算法 安全
什么是Java泛型类型?
【4月更文挑战第13天】
12 0
什么是Java泛型类型?