在 Go 中实现抽象类
在 Go 中,抽象类本身并不支持。但是,可以通过使用涉及以下内容的方法来模拟抽象类行为:
示例
考虑以下代码,它使用 start 和 doWork 方法定义了一个抽象类型 Daemon:
type Daemon interface { start(time.Duration) doWork() }
为了提供默认实现,我们可以创建一个嵌入 Daemon 接口的抽象类型(例如 AbstractDaemon)并提供方法的默认实现:
type AbstractDaemon struct { Daemon } func (a *AbstractDaemon) start(duration time.Duration) { ticker := time.NewTicker(duration) // this will call daemon.doWork() periodically go func() { for { <-ticker.C a.doWork() } }() }
具体类型
现在,我们可以创建继承自 AbstractDaemon 类型的具体类型,并为 doWork 提供实现方法:
type ConcreteDaemonA struct { *AbstractDaemon foo int } func (a *ConcreteDaemonA) doWork() { a.foo++ fmt.Println("A: ", a.foo) } type ConcreteDaemonB struct { *AbstractDaemon bar int } func (b *ConcreteDaemonB) doWork() { b.bar-- fmt.Println("B: ", b.bar) }
用法
我们可以使用这些具体类型来创建实例并调用它们的方法:
var dA Daemon = newConcreteDaemonA() var dB Daemon = newConcreteDaemonB() dA.start(1 * time.Second) dB.start(5 * time.Second) time.Sleep(100 * time.Second)
此方法提供一种在 Go 中实现抽象类的机制,允许默认方法实现和通过嵌入进行多重继承。
以上是Go中如何实现抽象类?的详细内容。更多信息请关注PHP中文网其他相关文章!