インターフェイスを使用したさまざまな型の共通メソッドの実装
Go では、インターフェイスは、複数の型が実装できるコントラクトを定義するための強力なメカニズムを提供します。ただし、同じインターフェイスを実装する複数の型に対して同様のメソッドを実装するのは冗長に思える場合があります。
これに対処するために、両方とも str という名前の文字列フィールドを含む 2 つの構造体 First と Second の例を考えてみましょう。両方の構造体に、str の値を出力するための PrintStr() メソッドを定義するインターフェイス A を実装する必要があります。
最初は、次のように First と Second に別々の実装を定義するのが自然に思えるかもしれません。
type First struct { str string } func (f First) PrintStr() { fmt.Print(f.str) } type Second struct { str string } func (s Second) PrintStr() { fmt.Print(s.str) }
しかし、このアプローチは確かに反復的です。冗長性を避けるために、代わりに構成的なアプローチを活用できます。共通の機能を含む基本型 WithString を定義し、それを First struct と Second struct の両方に埋め込むことができます。これにより、PrintStr() メソッドを基本型で 1 回だけ定義できるようになります。
type WithString struct { str string } func (w WithString) PrintStr() { fmt.Print(w.str) } type First struct { WithString } type Second struct { WithString } type A interface { PrintStr() }
この手法は、PrintStr() メソッドの実装を特定の型 First および Second から効果的に切り離し、結果として、より多くの型を定義します。簡潔で保守しやすいコードベース。
たとえば、次のような使用法があるとします。
a := First{ WithString: WithString{ str: "foo", }, }
呼び出しa.PrintStr() は "foo" を出力します。これは、最初に PrintStr() 実装を提供する WithString 型が埋め込まれているためです。
Go では、合成とインターフェイスを利用することで、異なる型が共通点を共有できる型階層を作成できます。冗長なコードを必要とせずに機能を実現します。
以上がGo のインターフェイスを使用して、異なる型の冗長なメソッド実装を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。