ホームページ > バックエンド開発 > Golang > Go で隠しインターフェイス メソッドを適切に実装するにはどうすればよいですか?

Go で隠しインターフェイス メソッドを適切に実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-30 02:21:09
オリジナル
416 人が閲覧しました

How to Properly Implement Hidden Interface Methods in Go?

隠しメソッドを使用したインターフェイスの実装

会計システムを開発する場合、インターフェイスの特定の実装をメイン プログラムから隠すことが望ましい場合があります。 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 サイトの他の関連記事を参照してください。

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