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,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
安全 Java 编译器
Java类型提升与类型转换详解
本文详解Java中的类型提升与类型转换机制,涵盖类型提升规则、自动类型转换(隐式转换)和强制类型转换(显式转换)的使用场景与注意事项。内容包括类型提升在表达式运算中的作用、自动转换的类型兼容性规则,以及强制转换可能引发的数据丢失和运行时错误。同时提供多个代码示例,帮助理解byte、short、char等类型在运算时的自动提升行为,以及浮点数和整型之间的转换技巧。最后总结了类型转换的最佳实践,如避免不必要的转换、使用显式转换提高可读性、金融计算中使用BigDecimal等,帮助开发者写出更安全、高效的Java代码。
225 0
|
3月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
421 143
|
3月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
1719 102
|
1月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
91 7
|
1月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
164 3
|
1月前
|
存储 Java Go
【Golang】(3)条件判断与循环?切片和数组的关系?映射表与Map?三组关系傻傻分不清?本文带你了解基本的复杂类型与执行判断语句
在Go中,条件控制语句总共有三种if、switch、select。循环只有for,不过for可以充当while使用。如果想要了解这些知识点,初学者进入文章中来感受吧!
126 1
|
2月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
2月前
|
Linux Go iOS开发
IDA 9.2 发布:Golang 改进、新 UI 组件、类型解析等
IDA Pro 9.2 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
650 0
|
4月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
169 24

推荐镜像

更多