異なるパッケージに同一のメソッド シグネチャを持つ複数のインターフェイスを実装する方法
競合するメソッド シグネチャを持つ別のパッケージで定義されたインターフェイスを実装する必要があるとします。 。これは難しいかもしれませんが、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() に実装されたロジックは異なっています。これに対処するには、オブジェクトの周囲にラッパーを作成します。
個別のラッパーを実装することで、予期されるインターフェイス タイプ (A.Doer または B.Doer) に基づいて使用するメソッドを制御できます。これにより、両方のロジックを実装するのに苦労する元の C オブジェクト上の単一の Do() メソッドが不要になります。
以上が複数のインターフェイスで競合するメソッド シグネチャを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。