ホームページ  >  記事  >  バックエンド開発  >  Go で同じメソッド シグネチャを持つ複数のインターフェイスを実装するにはどうすればよいですか?

Go で同じメソッド シグネチャを持つ複数のインターフェイスを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 22:12:30779ブラウズ

How to Implement Multiple Interfaces with Identical Method Signatures in Go?

同一のメソッド シグネチャを持つ複数のインターフェイスの実装

Go では、インターフェイスは型安全性を提供し、多重継承をサポートします。ただし、異なるパッケージで定義された 2 つのインターフェイスが同じメソッド シグネチャを共有する場合、両方を 1 つの実装で実装すると不整合が生じる可能性があります。

これに対処するために、Go プログラミング言語はインターフェイスの実装時にメソッドの型の一貫性を強制します。これにより、明確さが確保され、潜在的な混乱が軽減されます。

提供されたシナリオでは、同じ C.Do メソッドを使用して、両方のインターフェイス A.Doer と B.Doer を実装したいと考えています。 C.Do は A.Doer の要件を満たしますが、B.Doer が期待するロジックに準拠していない可能性があります。

1 つの解決策は、型アサーションを利用することです。オブジェクトが A.Doer と B.Doer の両方を満たすかどうかを確認することで、どちらの実装を使用するかを決定できます。

<code class="go">if _, ok := obj.(A.Doer); ok {
    // Use A.Doer implementation
}
if _, ok := obj.(B.Doer); ok {
    // Use B.Doer implementation
}</code>

ただし、A.Do と B.Do のロジックが大幅に異なる場合は、堅牢なアプローチは、オブジェクトの個別のラッパーを作成することです。

2 つの新しい型 DoerA と DoerB を作成します。それぞれに C オブジェクトが含まれ、それぞれ A.Doer または B.Doer のいずれかを実装します。適切なラッパーを対応する関数に渡すことで、期待されるロジックが実装されていることを確認できます。

<code class="go">type DoerA struct {
    C C
}

// Implement A.Do() using C.Do()
func (d DoerA) Do() string {
    return "C now implements A as per its logic"
}

type DoerB struct {
    C C
}

// Implement B.Do() using C.Do()
func (d DoerB) Do() string {
    return "C now implements B as per its logic"
}

func main() {
    c := C(0)
    dA := DoerA{C: c}
    dB := DoerB{C: c}
    A.FuncA(dA)
    B.FuncB(dB)
}</code>

個別のラッパーを使用することで、基礎となる C を利用しながら、各インターフェイス メソッドの正しい実装を強制できます。オブジェクト。

以上がGo で同じメソッド シグネチャを持つ複数のインターフェイスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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