Go のインターフェイスによりポリモーフィズムが可能になり、これらのインターフェイスを実装する任意の型で動作できるジェネリック型を作成できます。ただし、 Java や C などの言語とは異なり、Go は多重継承をサポートしていません。これにより、継承を行わずに 2 つのインターフェイスを「実装する必要がある」型を使用するなど、特定の設計パターンをどのように実現するかという問題が生じます。
構造体の型を非表示にして表現するにはそれをインターフェースとして:
type Card interface { GetFace() string GetSuit() string }
Card インターフェースの String() メソッドも定義したいと考えていますが、インターフェースをカードインターフェースに渡すことができないため、これには課題が生じます。 String() メソッドの実装。
構造体を非表示にしてインターフェイスのみをエクスポートするというアンチパターンを使用する代わりに、次のアプローチを検討してください。
外部からの変更を防ぐために構造体フィールドを非表示にしますが、ポインタをエクスポートします。それ:
type Card struct { // ... struct fields here } func NewCard(...) *Card { // ... }
カード構造体へのポインターの String() メソッドを定義します:
func (c *Card) String() string { // ... }
このアプローチ
「インターフェイスの隠蔽」パターンは魅力的に見えるかもしれませんが、カプセル化が不十分になり、ドキュメントが損なわれ、不必要な複雑さが生じる可能性があります。ポインタを構造体にエクスポートし、そのポインタ型に String() メソッドを実装するという推奨アプローチは、よりクリーンで効果的なソリューションを提供します。
以上が多重継承を行わずに Go インターフェイスにメソッドを効果的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。