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

複数のインターフェイスで競合するメソッド シグネチャを処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 21:50:30116ブラウズ

How to Handle Conflicting Method Signatures in Multiple Interfaces?

異なるパッケージに同一のメソッド シグネチャを持つ複数のインターフェイスを実装する方法

競合するメソッド シグネチャを持つ別のパッケージで定義されたインターフェイスを実装する必要があるとします。 。これは難しいかもしれませんが、Go は解決策を提供します。

例を考えてみましょう:

  • パッケージ A:

    package A
    
    type Doer interface {
      Do() string
    }
    
    func FuncA(doer A.Doer) {
      // Use doer.Do() here to implement functionality
    }
  • パッケージ B 内:

    package B
    
    type Doer interface {
      Do() string
    }
    
    func FuncB(doer B.Doer) {
      // Use doer.Do() here to implement functionality
    }

メイン パッケージ内:

package main

import (
    "path/to/A"
    "path/to/B"
)

type C int

// C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A.
func (c C) Do() string {
    return "C implements both A and B"
}

func main() {
    c := C(0)
    A.FuncA(c) // Acceptable as C implements A.Doer
    B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements
}

解決策:

この競合を解決するために、Go は簡潔なアプローチを提供します。

if _, ok := obj.(A.Doer); ok {
}

これにより、(インターフェイス タイプの) オブジェクトが別のインターフェイス タイプ (A.Doer など) に準拠しているかどうかを実行時に検証できます。

ただし、OP ではさらに複雑な点が強調されています。パッケージ A とパッケージ B の Do() に実装されたロジックは異なっています。これに対処するには、オブジェクトの周囲にラッパーを作成します。

  • DoerA (フィールドとして C を使用し、A.Do() を論理的に実装します。
  • DoerB (C をフィールドとして使用し、B を実装))。 Do() を論理的に実行します。

個別のラッパーを実装することで、予期されるインターフェイス タイプ (A.Doer または B.Doer) に基づいて使用するメソッドを制御できます。これにより、両方のロジックを実装するのに苦労する元の C オブジェクト上の単一の Do() メソッドが不要になります。

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

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