ume

Ruby ポケモンで学ぶオブジェクト指向(ポリモーフィズム))

ポリモーフィズムとは?

⇨ 同じメソッドでありながら違う振る舞い

ポケモンの例(ポケモンクラスという親クラスと子クラス(ゼニガメ(Squirtle)とヒトカゲ( Charmander)クラスがあるという構造になっています)

# ポケモンクラスの定義
class Pokemon
  def initialize(name)
    @name = name
  end

  def attack
    # デフォルトの攻撃
    puts "#{@name}の攻撃!"
  end
end

# ゼニガメクラスの定義(ポケモンクラスを継承)
class Squirtle < Pokemon
  def initialize(name)
    super(name)
  end

  def attack
    # ゼニガメの攻撃
    puts "#{@name}のハイドロポンプ!"
  end
end

# ヒトカゲクラスの定義(ポケモンクラスを継承)
class Charmander < Pokemon
  def initialize(name)
    super(name)
  end

  def attack
    # ヒトカゲの攻撃
    puts "#{@name}のかえんほうしゃ!"
  end
end

# インスタンスの作成とポリモーフィズムの実行
 squirtle = Squirtle.new("ゼニガメ")
charmander = Charmander.new("ヒトカゲ")

# ポリモーフィズムを使ってattackメソッドを呼び出す
squirtle.attack.  出力結果 ヒトカゲのかえんほうしゃ
charmander.attack.  出力結果 ゼニガメのハイドロポンプ

ここでの注目はattackメソッドです。 子クラス内(ゼニガメヒトカゲ)で親クラス(ポケモンくらす)のメソッドを定義するとメソッドの上書きできる(オーバーライド).
つまりゼニガメクラスのインスタンスにattackメソッドを呼ぶとゼニガメクラス内に記載されたattackメソッドが呼ばれる。こうすることでattackメソッドの呼び出し方はクラスが違っても変わらないがメソッドの中身はクラスごとに変更することができる。