改进 Go 中的多态性和装饰器模式

我正在阅读一本设计模式书,并尝试将这些模式应用到 Go 中,以此作为学习两者的一种方式。


目前我已经达到了装饰者模式,我遇到了一个我很好奇的场景。


这是一些示例代码:


type Beverage interface {

    getDescription() string

    cost() float64

}


type HouseBlend struct{}


func (hb *HouseBlend) getDescription() string {

    return "House Blend Coffee"

}


func (hb *HouseBlend) cost() float64 {

    return .89

}


type Mocha struct {

    b Beverage

}


func (m *Mocha) getDescription() string {

    return m.b.getDescription() + ", Mocha"

}


func (m *Mocha) cost() float64 {

    return m.b.cost() + .20

}

有什么区别


var hb Beverage = &HouseBlend{}


//This works since hb is an interface type

hb = &Mocha{

    b: hb,

}


hb := &HouseBlend{}


//This assignment fails since Mocha is not type HouseBlend

hb = &Mocha{

    b: hb,

}

这也有效


hb := *new(Beverage)


    hb = &Espresso{}


    hb = &Mocha{

        b: hb,

    }

是否有一种简写方法可以为我的变量hb提供接口类型,或者它是否需要明确以便能够“装饰”我的结构并将变量重新分配给不同的类型?


欢迎任何关于改进装饰器模式和实现干净多态性的建议。谢谢你!


繁花如伊
浏览 97回答 2
2回答

噜噜哒

var hb Beverage是你如何明确地给变量一个类型。隐式类型将始终获得您输入的值的类型。我不确定你在这里用“速记”来寻找什么,因为var name Type它已经很短了,但如果你真的想使用一个简短的变量声明,你可以使用类型转换:hb := Beverage(&HouseBlend{})

守着一只汪

您可以使用缩写形式并hb使用以下方法声明为接口:hb:=Beverage(&HouseBlend{})这段代码并不完全正确:// You allocate a pointer to an interface, and redirect it to get an uninitialized interface valuehb := *new(Beverage)// Here, you throw away the value of the first assignmenthb = &Espresso{}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go