2 回答
TA贡献1784条经验 获得超8个赞
在我看来,你想要做的不是很像 Go。
ToggleSwitch
定义了四种明确适用于某种状态的方法。为了为这些方法中的任何一个提供实现,您还需要实现该状态(即使该状态不存在,例如通过将这些方法定义为无操作),但在这一点上,它根本不会感觉不提供所有这些方法。
使用类似 Go 的类型组合,嵌入的类型通常应该是“完整的”、完整的和有用的。嵌入类型提供的方法仅适用于该字段,无法访问“父”或其方法。
如果ToggleSwitch
还有其他不处理该状态的方法,那么只提供接口的部分实现是有意义的,但在这一点上,更好、更惯用的解决方案是定义ToggleSwitch
为两个独立的接口。
换句话说,我不认为有一种“Go 方式”来提供接口的部分实现(不是由几个接口组成),因为在 Go 中定义尽可能小的接口是惯用的。
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
- 2 回答
- 0 关注
- 133 浏览
添加回答
举报