为了账号安全,请及时绑定邮箱和手机立即绑定

部分实现接口的最佳实践

部分实现接口的最佳实践

Go
MYYA 2021-12-20 10:53:47
会是什么的去程部分提供了一个默认的实现?为了说明这一点,下面的切换开关驱动程序的简单示例是我按照我的 OO 直觉结束的死胡同......当然它不会编译(我知道为什么),我不一定愿意这样做。任何其他更适合 go 哲学的解决方案实际上会更好地正确理解这种常见需求的 go-way。完整的例子也可以在https://play.golang.org/p/MYED1PB-dS找到鉴于以下接口:type ToggleSwitch interface {    TurnOn()    TurnOff()    IsOn() bool    Toggle()}Toggle() 是提供默认实现的一个很好的候选者(即,根据当前状态,打开或关闭开关):// The Toggle() method can already be defined using TurnOn, TurnOff() and IsOn().type DefaultDriver struct {}// The following implementation would be fine for non-optimized cases:func (d *DefaultDriver) Toggle() {    state := d.IsOn()    fmt.Println("generic toogle ->", state)    if state {        d.TurnOff()    } else {        d.TurnOn()    }}然后一个实际的驱动程序可以使用或不使用它:// Example of an actual ToggleDriver which should fully implement the interface// based on the default implementation or not.// For example, if the toggle switch device has a bult-in toggle command, the// Toggle() method could be optimized to directly use it.type DummyDriver struct {    *DefaultDriver // promote DefaultDriver methods    state bool}func (d *DummyDriver) IsOn() bool {    return d.state}func (d *DummyDriver) TurnOff() {    d.state = false}func (d *DummyDriver) TurnOn() {    d.state = false}// Uncomment me to optimize me...//func (d *DummyDriver) Toggle() {//  fmt.Println("specialized toogle ->", d.state)//  d.state = !d.state//}
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

在我看来,你想要做的不是很像 Go。

ToggleSwitch定义了四种明确适用于某种状态的方法。为了为这些方法中的任何一个提供实现,您还需要实现该状态(即使该状态不存在,例如通过将这些方法定义为无操作),但在这一点上,它根本不会感觉不提供所有这些方法。

使用类似 Go 的类型组合,嵌入的类型通常应该是“完整的”、完整的和有用的。嵌入类型提供的方法仅适用于该字段,无法访问“父”或其方法。

如果ToggleSwitch还有其他不处理该状态的方法,那么只提供接口的部分实现是有意义的,但在这一点上,更好、更惯用的解决方案是定义ToggleSwitch为两个独立的接口。

换句话说,我不认为有一种“Go 方式”来提供接口的部分实现(不是由几个接口组成),因为在 Go 中定义尽可能小的接口是惯用的。


查看完整回答
反对 回复 2021-12-20
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

就我个人而言,我会为 DefaultDriver 类型实现 Toggle、IsOn、TurnOn 和 TurnOff 方法,因此它将满足 ToggleSwitch 接口。


然后, DummyDriver 类型将嵌入 DefaultDriver 类型。


这样,您就可以根据需要为 DummyDriver 类型实现专门的方法。


结果将是这样的:


package main


import "fmt"


type ToggleSwitch interface {

    TurnOn()

    TurnOff()

    IsOn() bool

    Toggle()

}


type DefaultDriver struct {

    state bool

}


func (d *DefaultDriver) Toggle() {

    state := d.IsOn()

    fmt.Println("generic toogle ->", state)

    if state {

        d.TurnOff()

    } else {

        d.TurnOn()

    }

}


func (d *DefaultDriver) IsOn() bool {

    return d.state

}


func (d *DefaultDriver) TurnOff() {

    d.state = false

}


func (d *DefaultDriver) TurnOn() {

    d.state = true

}


type DummyDriver struct {

    DefaultDriver

    state bool

}


// Uncomment me to optimize me...

//func (d *DummyDriver) Toggle() {

//  fmt.Println("specialized toogle ->", d.state)

//  d.state = !d.state

//}


func main() {

    d := DummyDriver{state: false}

    d.Toggle()

    d.Toggle()

    d.Toggle()

}

https://play.golang.org/p/Xm-8A0xoRb


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信