如何在Go中实现抽象类?由于Go不允许我们在接口中包含字段,因此这将是一个无状态的对象。因此,换句话说,Go中的方法是否可以具有某种默认实现?
考虑一个例子:
type Daemon interface { start(time.Duration) doWork() } func (daemon *Daemon) start(duration time.Duration) { ticker := time.NewTicker(duration) // this will call daemon.doWork() periodically go func() { for { <- ticker.C daemon.doWork() } }() } type ConcreteDaemonA struct { foo int } type ConcreteDaemonB struct { bar int } func (daemon *ConcreteDaemonA) doWork() { daemon.foo++ fmt.Println("A: ", daemon.foo) } func (daemon *ConcreteDaemonB) doWork() { daemon.bar-- fmt.Println("B: ", daemon.bar) } func main() { dA := new(ConcreteDaemonA) dB := new(ConcreteDaemonB) start(dA, 1 * time.Second) start(dB, 5 * time.Second) time.Sleep(100 * time.Second) }
由于无法将接口用作接收器,因此无法编译。
实际上,我已经回答了我的问题(请参见下面的答案)。但是,这是实现这种逻辑的惯用方式吗?除了语言的简单性之外,还有什么理由不使用默认实现吗?
一个简单的解决方案是移至daemon *Daemon参数列表(因此start(...)从界面中删除):
daemon *Daemon
start(...)
type Daemon interface { // start(time.Duration) doWork() } func start(daemon Daemon, duration time.Duration) { ... } func main() { ... start(dA, 1 * time.Second) start(dB, 5 * time.Second) ... }