他のパッケージからエクスポートされていないメソッドを使用したインターフェイスの実装
Go では、インターフェイスは、実装する必要があるメソッドのセットを定義するコントラクトとして機能します。それに固執するあらゆるタイプ。通常、インターフェイスのメソッドは、他のパッケージからのアクセスを許可するためにエクスポートされます。ただし、使用側プログラムから特定の実装を非表示にする必要があるシナリオも考えられます。
会計システム アクセス用のインターフェイスを定義する次の例を考えてみましょう。
package accounting import "errors" type IAdapter interface { GetInvoice() error }
非表示にするには特定の実装では、インターフェイス メソッドをエクスポート解除し、適切な実装を呼び出すラッパー関数を基本パッケージに導入します。アダプタ:
var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.GetInvoice() }
このアプローチは有望に見えますが、別のパッケージにインターフェイスを実装しようとすると問題が発生します。コンパイラは、エクスポートされていない GetInvoice メソッドを表示できないというエラーを出します。
この問題は、Go でのインターフェイスの動作方法に起因します。インターフェイスはメソッド シグネチャのみで構成され、その実装についての知識はありません。型がインターフェイスを実装する場合、インターフェイスと同じシグネチャを持つすべてのメソッドを公開する必要があります。
この制限を克服するには、匿名の構造体フィールドを利用できます。
type Adapter struct { accounting.IAdapter }
これにより、インターフェースを匿名で埋め込むことで別のパッケージにインターフェースを実装できますが、エクスポートされていないメソッドのカスタム実装を提供することはできません。
より慣用的な表現解決策は、エクスポートされていないアダプターを公開し、基本パッケージに登録関数を提供することです。
package accounting type IAdapter interface { GetInvoice() error } --- package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } --- package main func main() { accountingsystem.SetupAdapter() }
このアプローチにより、適切な実装の登録を可能にしながらアダプターが確実に隠蔽されたままになります。
以上が別の Go パッケージからエクスポートされていないメソッドを使用してインターフェイスを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。