【学習golangシリーズ】インターフェースでポリモーフィズム

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

インターフェース

インターフェースはメソッドの集まりを定義することができる。
クラスのないgolangでは、インターフェースがポリモーフィズムを可能にしてくれる。

golangでのポリモーフィズムって

ポリモーフィズムって今更ここで解説することでもない気がするのだけれど、
classが当たり前の言語だと意識しなくても実現できてしまっているため、一応。
(とは言っても大差ないのだけれど。)

golangでのポリモーフィズムは、構造体にメソッドの権限を付与するイメージに近い(と勝手に捉えている)。

手順

インターフェースを使う手順は次の通り。

  1. 構造体を定義する
  2. 構造体のメソッドを定義する
  3. インターフェースに構造体のメソッド名を入れる
  4. main関数内で構造体型の変数を定義する。
  5. main関数内でインターフェース型の変数を定義し、構造体型の変数を代入する
  6. インターフェース型の変数から、構造体のメソッドを呼び出す

と、説明してもよくわからないと思われるので、実例。

package main

import (
    "fmt"
)

type Human interface {
    // インターフェースにはTalkメソッドとWalkメソッドのみいれてある
    Talk()
    Walk()
    // Run()
}

// 日本人構造体
type Japanese struct {
    name string
    age int
}

// 米国人構造体
type American struct {
    name string
    age int
}

// 日本人用Talkメソッド
func (j Japanese) Talk(){
    fmt.Printf("%sです。%dです。
", j.name, j.age)
}

// 日本人用Walkメソッド
func (j Japanese) Walk(){
    fmt.Println("トコトコ")
}

// 日本人用Runメソッド
func (j Japanese) Run(){
    fmt.Println("シュタタタ")
}

// 米国人用Talkメソッド
func (a American) Talk(){
    fmt.Printf("I'm %s.I'm %d years old.
", a.name, a.age)
}

// 米国人用Walkメソッド
func (a American) Walk(){
    fmt.Println("tokotoko")
}

// 米国人用Runメソッド
func (a American) Run(){
    fmt.Println("shutatata")
}

func main(){

    j := Japanese{"umentu", 5}
    // 構造体の値をインターフェースに設定
    var h Human = j
    h.Talk()
    h.Walk()
    // h.Run() はHumanに入っていないから実行できない

    a := American{"John", 100}
    // 構造体の値をインターフェースに設定
    var h2 Human = a
    h2.Talk()
    h2.Walk()
    // h2.Run() はHumanに入っていないから実行できない
}

実際に使ってみると、「なるほど」と思えるかも。

Related posts

コメントを残す