加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:56:48 所属栏目:大数据 来源:网络整理
导读:golang中无继承概念,但利用golang 匿名组合 即可实现面向对象程序设计中继承的效果。在面向对象程序设计中,一般常见的两种超类型:接口,抽象类。在golang中,则更精简为只包含接口。在设计模式中,有要面向接口(超类型)编程这一重要的设计原则。在某些场

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

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

java代码:

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对象

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字段,这就类似与抽象类的子类必须实现抽象类(父类)中的抽象方法:

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接口字段
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读