Go におけるポリモーフィズム: それは存在しますか?
ポリモーフィズム、異なるクラスのオブジェクトが同一のメソッドを持つ機能は、基本的な側面ですオブジェクト指向プログラミングのこと。ただし、Go では、インターフェイスの setter メソッドは使用できないようです。
基本的な例を見てみましょう:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data } func (this MyStruct) Set(i int) { this.data = i }
このコードを実行すると、MyStruct 型の Set メソッドは失敗します。受信者はポインタではありません。これに加えられた変更は、関数が終了すると失われます。
レシーバーをポインタに変更することでこれを修正することもできます。
func (this *MyStruct) Set(i int) { this.data = i }
ただし、これによりコンパイル エラーが発生します。 。 Go のインターフェイス メソッドはポインター レシーバーを持つことができません。
では、このシナリオでポリモーフィズムを実現する方法はありますか?
最も近い代替方法は、インターフェイス型とインターフェイスを実装する匿名構造体:
type MyInterfacer interface { Get() int Set(i int) } var mi MyInterfacer = &MyStruct{123} fmt.Println(mi.Get()) // prints 123 mi.Set(456) fmt.Println(mi.Get()) // prints 456
このソリューションは真のポリモーフィズムではありませんが、インターフェイスを利用して提供しますさまざまなタイプのオブジェクトを操作するためのクリーンで柔軟な方法です。
以上がGo はポリモーフィズムをサポートしていますか: Setter メソッドの回避策を見つけるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。