Go での抽象クラスの実装
Go では、抽象クラスはネイティブにサポートされていません。ただし、次のようなアプローチを使用して抽象クラスの動作をエミュレートすることは可能です。
例
次のコードを考えてみましょう。これは、start メソッドと doWork メソッドを持つ抽象型デーモンを定義します。
type Daemon interface { start(time.Duration) doWork() }
デフォルトの実装を提供するには、デーモン インターフェイスとメソッドのデフォルト実装を提供します。
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 型から継承する具象型を作成し、次のメソッドの実装を提供できます。ドゥーワークメソッド:
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 中国語 Web サイトの他の関連記事を参照してください。