Go言語のインターフェースで実現するポリモーフィズムの基本
生徒
「先生、Go言語でポリモーフィズムってどうやって実現するんですか?」
先生
「ポリモーフィズムは、同じ操作でも異なるオブジェクトごとに異なる動作を実現する仕組みです。Goではインターフェースを使うことで、これを簡単に実現できます。」
生徒
「インターフェースを使うだけでそんなことができるんですか?」
先生
「そうです。インターフェースは『こういう機能を持っているもの』と宣言する抽象的な型で、具体的な構造体がその機能を実装すれば、同じ操作で扱えるんです。」
生徒
「具体的な例を見てみたいです!」
先生
「では、簡単な例を順に説明しましょう。」
1. ポリモーフィズムとは?
ポリモーフィズムとは、ギリシャ語で「多くの形」を意味し、プログラミングでは同じ操作で異なる型に対応できることを指します。例えば、動物の鳴き声を出すメソッドがあったとして、犬なら「ワンワン」、猫なら「ニャー」と鳴くように処理を変えられます。
2. Go言語のインターフェースでポリモーフィズムを実現
Goでは、インターフェースを定義して構造体がそれを実装することでポリモーフィズムを実現できます。インターフェースには「どんなメソッドを持っているか」を宣言します。
type Animal interface {
Speak()
}
type Dog struct{}
type Cat struct{}
func (d Dog) Speak() {
fmt.Println("ワンワン")
}
func (c Cat) Speak() {
fmt.Println("ニャー")
}
ここでは Animal インターフェースを定義し、Dog と Cat が Speak メソッドを実装しています。
3. インターフェース型で共通操作
インターフェース型に格納することで、異なる型でも同じ操作で扱えます。
func MakeSpeak(a Animal) {
a.Speak()
}
func main() {
var dog Animal = Dog{}
var cat Animal = Cat{}
MakeSpeak(dog) // ワンワン
MakeSpeak(cat) // ニャー
}
このように、MakeSpeak 関数では Animal 型の引数を受け取り、内部では Speak メソッドを呼ぶだけで、犬も猫も鳴き声を出せます。これがポリモーフィズムです。
4. ポリモーフィズムの利点
- 同じ関数や操作で異なる型を扱える
- コードの再利用性が高まる
- 拡張性が高く、新しい型を追加しやすい
- プログラムの構造がわかりやすくなる
Goのインターフェースは抽象的で柔軟な設計を可能にし、ポリモーフィズムを簡単に取り入れることができます。
5. 実用例:動物園のシステム
例えば動物園のシステムを作るとき、Animal インターフェースを使えば、犬や猫、鳥など新しい動物を追加しても共通の操作で管理できます。
animals := []Animal{Dog{}, Cat{}}
for _, a := range animals {
a.Speak()
}
このループでは、リストに追加したすべての動物に対して Speak メソッドを呼び出せるので、新しい動物を追加するたびに関数を変更する必要がありません。