如何在Go中实现抽象类?

如何在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(...)从界面中删除):

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)

...

}

以上是 如何在Go中实现抽象类? 的全部内容, 来源链接: utcz.com/qa/417011.html

回到顶部