ホームページ >バックエンド開発 >Golang >Go で抽象クラスを実装するにはどうすればよいですか?

Go で抽象クラスを実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-29 10:50:11489ブラウズ

How Can Abstract Classes Be Implemented in Go?

Go での抽象クラスの実装

Go では、抽象クラスはネイティブにサポートされていません。ただし、次のようなアプローチを使用して抽象クラスの動作をエミュレートすることは可能です。

  1. 必要な抽象メソッドを使用してインターフェイスを定義する。
  2. 要求を満たす埋め込みレシーバーを持つ型を作成する。インターフェイスを提供し、デフォルトの実装を提供します。 Methods.

次のコードを考えてみましょう。これは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。