隠しメソッドを使用したインターフェイスの実装
会計システムを開発する場合、インターフェイスの特定の実装をメイン プログラムから隠すことが望ましい場合があります。 1 つの会計システムだけがアクティブであることを確認します。これを実現するには、インターフェイス メソッドをアンエクスポートし、ローカル アダプターから関数を呼び出すエクスポート関数を作成することを検討できます。
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 にアクセスできないため、この方法ではコンパイル エラーが発生します。 accountssystem パッケージのメソッド。
cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter: accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method) have accountingsystem.getInvoice() error want accounting.getInvoice() error
匿名構造体フィールドアプローチ
考えられる解決策の 1 つは、匿名の構造体フィールドを使用することです。これにより、accountingsystem.Adapter はaccounting.IAdapter インターフェイスを満たすことができますが、ユーザーはエクスポートされていないメソッドの独自の実装を提供できなくなります。
type Adapter struct { accounting.IAdapter }
代替アプローチ
より慣用的なアプローチは、エクスポートされていないアダプター タイプを作成し、アダプターをアカウンティングに登録する機能を提供することです。 package.
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) }
このアプローチを使用すると、accountingsystem.adapter 型がメイン プログラムから隠蔽され、SetupAdapter 関数を呼び出すことで会計システムを初期化できます。
以上がGo で隠しインターフェイス メソッドを適切に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。