「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 複数のインターフェイスで競合するメソッド シグネチャを処理するにはどうすればよいですか?

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

2024 年 12 月 21 日に公開
ブラウズ:921

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.行為者)。これにより、両方のロジックを実装するのに苦労する元の C オブジェクト上の単一の Do() メソッドが不要になります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3