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

Patricia Arquette
リリース: 2024-11-03 19:57:30
オリジナル
591 人が閲覧しました

How to Implement Interfaces with Identical Method Signatures from Separate Packages in Go?

別々のパッケージから同じメソッド シグネチャを持つインターフェイスを実装する

Go では、同じメソッド シグネチャを持つ 2 つの異なるインターフェイスを実装することは現実的ではありません。異なるパッケージ。通常、各インターフェイス タイプは特定の実装を期待し、タイプ セーフティを確保します。

ただし、オブジェクトが同じ名前のメソッドを持つ複数のインターフェイスを満たす必要がある場合、すべてのインターフェイスに一貫したロジックを実装することが困難になる可能性があります。

ケース例:

同一のメソッド シグネチャを持つインターフェイス Doer を含む 2 つのパッケージ A と B を考えます:

package A
type Doer interface {
    Do() string
}
ログイン後にコピー
package B
type Doer interface {
    Do() string
}
ログイン後にコピー

問題:

パッケージ main では、単一のオブジェクト C が A.Doer と B.Doer の両方を実装するように設計されています:

package main

func (c C) Do() string {
    return "C now implements both A and B"
}
ログイン後にコピー

ただし、この実装は次の場合にバグを引き起こします。 C で実装された Do メソッドは A.Doer のみを対象としているため、B.FuncB(c) を呼び出します。

解決策:

Go の埋め込み機能を使用し、個別のラッパー タイプを使用します。作成できます:

  • DoerA: C を埋め込み、A.Do() を実装します。
  • DoerB: C を埋め込み、B を実装します.Do().

適切なラッパー型を引数として A.FuncA および B.FuncB に渡すことで、各インターフェイスに必要なロジックを維持できます。

追加の注意事項:

  • 場合によっては、潜在的な型の衝突を発生させずに特定のインターフェイス要件を満たすために、専用の実装型の使用が必要になることがあります。
  • 複雑な継承を扱う場合重複するメソッド シグネチャを持つ複数のインターフェイスが関与するシナリオでは、ロジックを慎重に検討し、統合間の一貫性を確保することが重要です。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート