在 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中文網其他相關文章!