Golang はオブジェクト指向プログラミングをサポートするプログラミング言語です。従来のオブジェクト指向プログラミング言語のクラス、継承、ポリモーフィズムなどの概念はありませんが、Golang にはポリモーフィズムを実現するためのメソッドが多数あります。この記事では、Golang でポリモーフィズムを実装する方法を紹介します。
1. インターフェイス
Golang では、インターフェイスはポリモーフィズムを実現する方法です。インターフェイスはメソッドの集合であり、インターフェイス内のすべてのメソッドを実装している限り、型はインターフェイスを実装しているとみなされます。この方法は、従来の継承方法よりも柔軟性が高く、コードとの結合が少なくなります。
以下はインターフェイスの実装例です:
type Animal interface { Move() Speak() } type Dog struct { Name string } func (d Dog) Move() { fmt.Printf("%s is moving\n", d.Name) } func (d Dog) Speak() { fmt.Printf("%s is speaking\n", d.Name) } func main() { var a Animal a = Dog{Name: "Tom"} a.Move() a.Speak() }
上記のコードでは、Move および Speak の 2 つのメソッドを含むインターフェイス Animal が定義されています。次に、構造 Dog が定義され、Animal インターフェースの 2 つのメソッドが実装されます。 main関数では、Animal型の変数aを定義し、Dog型のインスタンスに代入しています。次に、a の Move メソッドと Speak メソッドを呼び出します。Dog は Animal インターフェイスを実装しているため、直接呼び出すことができます。
ここで、Golang のインターフェイスは暗黙的に実装されることに注意してください。つまり、型がインターフェイス内のすべてのメソッドを実装している限り、インターフェイスは明示的な宣言なしで自動的に実装されます。
2. 構造のネスト
構造のネストもポリモーフィズムを実現する方法の 1 つです。ある型を別の型内にネストすると、ネストされた型のメソッドをインターフェイスし、外側の型に共通のインターフェイス メソッドを定義できるため、ポリモーフィズムが実現します。
以下は構造体のネストの例です。
type Animal struct { Name string } func (a Animal) Move() { fmt.Printf("%s is moving\n", a.Name) } type Dog struct { Animal } func (d Dog) Speak() { fmt.Printf("%s is speaking\n", d.Name) } type Cat struct { Animal } func (c Cat) Speak() { fmt.Printf("%s is speaking\n", c.Name) } type Moveable interface { Move() } type Speakable interface { Speak() } func main() { var m Moveable var s Speakable m = Dog{Animal{Name: "Tom"}} s = Cat{Animal{Name: "Kitty"}} m.Move() s.Speak() }
上記のコードでは、Animal 構造体が定義され、次に Dog 構造体と Cat 構造体がそれぞれ定義され、すべてネストされています。 Animal 構造で、それぞれのメソッドを実装します。次に、Moveable インターフェイスと Speakable インターフェイスが定義され、これら 2 つのインターフェイスを含む変数 m と s が main 関数で宣言され、それぞれ Dog タイプと Cat タイプのインスタンスに割り当てられます。次に、m の Move メソッドと s の Speak メソッドをそれぞれ呼び出して、対応する情報を出力します。
構造のネストを通じて、共通のインターフェイス タイプを実装してポリモーフィズムを実現できます。ネストされた構造には同じ名前のメソッドまたはフィールドを含めることはできません。そうしないと競合が発生します。
3. switch ステートメント
インターフェイスと構造のネストに加えて、Golang は switch ステートメントを使用してポリモーフィズムを実現することもできます。
次は、switch ステートメントを使用してポリモーフィズムを実現する例です。
type Animal struct { Name string Type string } func (a Animal) Move() { fmt.Printf("%s is moving\n", a.Name) } func (a Animal) Speak() { switch a.Type { case "dog": fmt.Printf("%s is barking\n", a.Name) case "cat": fmt.Printf("%s is meowing\n", a.Name) } } func main() { d := Animal{Name: "Tom", Type: "dog"} c := Animal{Name: "Kitty", Type: "cat"} d.Move() d.Speak() c.Move() c.Speak() }
上記のコードでは、Animal 構造体が定義されており、Move メソッドと Speak メソッドがその構造体で定義されています。 switch ステートメントは、Speak メソッドで使用され、Animal の Type 属性に応じて異なる情報を出力します。 main関数では犬型のAnimalインスタンスと猫型のAnimalインスタンスを定義し、それぞれMoveメソッドとSpeakメソッドを呼び出しています。 Speak メソッドが出力する情報は Type 属性によって異なるため、ポリモーフィズムが実装されています。
switch 文を使用してポリモーフィズムを実装する場合、型に応じて判断して出力する必要があることに注意してください。型が増えると、コードの複雑さが増す可能性があります。
概要:
この記事では、Golang でポリモーフィズムを実装する 3 つの方法 (インターフェイス、構造のネスト、switch ステートメント) を紹介します。さまざまな方法にはそれぞれ独自の利点と適用可能なシナリオがあるため、開発者は特定のニーズに応じて適切な方法を選択してポリモーフィズムを実装できます。
以上がGolang はポリモーフィズムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。