次のコラムでは、golang チュートリアル コラムから Go でのポリモーフィズムの解析 - インターフェイスは必要ありません のポリモーフィズムについて紹介します。インターフェイスは必要ありません。困っている友人の役に立てば幸いです。 !
Go でのポリモーフィズムの解析 - インターフェイスは必要ありません でポリモーフィズムを使用したいが、インターフェイスは好きではない場合はどうすればよいでしょうか?続きを読んでください...
まず、何をしたいのか見てみましょう:
var dog, duck *Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack!
dog
と duck
は同じ型です ( ## #*動物###)。各変数は異なるコンストラクターを使用してインスタンス化され、makeNoise
同じメソッドが呼び出されたときの動作は異なります。 通常、この例はインターフェイスを使用する目的ですが、実際の使用法はそれほど単純ではありません。
これを機能させる方法を見てみましょう:
ここ (https://play.golang.org/p/P5Ovn_K-yyo) をクリックして完全なコードを表示してくださいAnimaltype Animal struct { makeNoiseFn func(*Animal) string name string legs int }
構造には、name
属性と legs
属性、および mkeNoiseFn
属性が含まれています。これは実際には、*Animal
パラメータを受け取り、文字列を返す関数です。 <pre class="brush:php;toolbar:false">func (a *Animal) makeNoise() string {
return a.makeNoiseFn(a)
}</pre>
メソッドは実際には、対応する動物 makenoiseFn
を呼び出し、引数として動物自体へのポインタを取る単なるラッパーです。 <pre class="brush:php;toolbar:false">func NewDog(name string) *Animal {
return &Animal{
makeNoiseFn: func(a *Animal) string {
return a.name + " says woof!"
},
legs: 4,
name: name,
}
}
func NewDuck(name string) *Animal {
return &Animal{
makeNoiseFn: func(a *Animal) string {
return a.name + " says quack!"
},
legs: 4,
name: name,
}
}</pre>
あとは、同じ型に異なる動作をさせ、その
プロパティに異なる関数を割り当てるだけです。ここで、makeNoise
メソッドは、動物が犬かアヒルかに応じて、対応する関数を呼び出します。 これをやるべきですか?
この記事は、
すべきことではなく、できることを示すことを目的としています。ポリモーフィズムを実装する必要がある場合は、インターフェイスを使用する方が良い方法です。インターフェイスを使用する場合、このコードは次のようになります:
type Animal interface { makeNoise() string } type Dog struct { name string legs int } func (d *Dog) makeNoise() string { return d.name + " says woof!" } type Duck struct { name string legs int } func (d *Duck) makeNoise() string { return d.name + " says quack!" } func NewDog(name string) Animal { return &Dog{ legs: 4, name: name, } } func NewDuck(name string) Animal { return &Duck{ legs: 4, name: name, } } func main() { var dog, duck Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack! }元のアドレス: https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/
翻訳アドレス: https://learnku.com/go/t/52404
以上がGo でのポリモーフィズムの解析 - インターフェイスは必要ありませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。