多重継承を行わずに Go インターフェイスにメソッドを効果的に実装するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-23 02:00:34
オリジナル
608 人が閲覧しました

How Can I Effectively Implement Methods on Go Interfaces Without Multiple Inheritance?

Go でインターフェイスを使用する理由

Go のインターフェイスによりポリモーフィズムが可能になり、これらのインターフェイスを実装する任意の型で動作できるジェネリック型を作成できます。ただし、 Java や C などの言語とは異なり、Go は多重継承をサポートしていません。これにより、継承を行わずに 2 つのインターフェイスを「実装する必要がある」型を使用するなど、特定の設計パターンをどのように実現するかという問題が生じます。

使用例

構造体の型を非表示にして表現するにはそれをインターフェースとして:

type Card interface {
    GetFace() string
    GetSuit() string
}
ログイン後にコピー

Card インターフェースの String() メソッドも定義したいと考えていますが、インターフェースをカードインターフェースに渡すことができないため、これには課題が生じます。 String() メソッドの実装。

代替アプローチ

構造体を非表示にしてインターフェイスのみをエクスポートするというアンチパターンを使用する代わりに、次のアプローチを検討してください。

Export a構造体へのポインタ

外部からの変更を防ぐために構造体フィールドを非表示にしますが、ポインタをエクスポートします。それ:

type Card struct {
    // ... struct fields here
}

func NewCard(...) *Card {
    // ...
}
ログイン後にコピー

ポインター型の String() を実装します

カード構造体へのポインターの String() メソッドを定義します:

func (c *Card) String() string {
    // ...
}
ログイン後にコピー

このアプローチ

  • 構造体を公開しながら構造体の詳細を非表示にするインターフェイス。
  • インターフェイスを特定の実装から切り離しておきます。
  • インターフェイスを使用するクライアントに String() 表現を提供します。

結論

「インターフェイスの隠蔽」パターンは魅力的に見えるかもしれませんが、カプセル化が不十分になり、ドキュメントが損なわれ、不必要な複雑さが生じる可能性があります。ポインタを構造体にエクスポートし、そのポインタ型に String() メソッドを実装するという推奨アプローチは、よりクリーンで効果的なソリューションを提供します。

以上が多重継承を行わずに Go インターフェイスにメソッドを効果的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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