Just do IT

思うは招く

オブジェクト指向プログラミングの「継承」をドラゴンボールに例えて考えてみる

オブジェクト指向プログラミングの3大特徴である、継承について、ドラゴンボールに例えてみた。

まず、悟空とベジータをクラスで考えるとこうなる。(細かいツッコミどころがあるが、概念をざっくり理解するためなので無視してください)

# 悟空
class Goku
  def charge
    "気をためる"
  end

  def fly
    "空を飛ぶ"
  end

  def kamehameha
    "かめはめ波"
  end
end

# ベジータ
class Vegeta
  def charge
    "気をためる"
  end

  def fly
    "空を飛ぶ"
  end

  def gyaric_hou
    "ギャリック砲"
  end
end

両者とも、気をためることができるし、空を飛ぶことができる。

なぜか? それは、ふたりともサイヤ人だから。

つまり、「共通した特徴」を持っている。これらの特徴を、「サイヤ人」という抽象クラス(スーパークラス)を使って抽象化してみると。

# サイヤ人クラス
class Saiya
  def charge
    "気をためる"
  end

  def fly
    "空を飛ぶ"
  end
end

# サイヤ人の血を引いてみた
class Goku < Saiya
  def kamehameha
    "かめはめ波"
  end
end

# サイヤ人の血を引いてみた
class Vegeta < Saiya
  def gyaric_hou
    "ギャリック砲"
  end
end

goku = Goku.new
puts goku.charge => "気をためる"
puts goku.kamehameha => "かめはめ波"

vegeta = Vegeta.new
puts vegeta.charge => "気をためる"
puts vegeta.gyaric_hou => "ギャリック砲"

悟空とベジータのクラスからは、「気をためる」「空を飛ぶ」といった技の記述は消えた。 しかし、サイヤ人の血を引くので、いつもどおり気をため、空を飛べる。 なぜならふたりは、サイヤ人クラスを「継承」しているから。

くわえて、それぞれかめはめ波ギャリック砲といった、「特化」した技を持っている。

超ざっくりだが、継承の例えはこんな感じ。

ビーデル天津飯とか、サイヤ人の血を引いてないのに空飛べる人けっこういるやん!」

などという野暮なツッコミは禁止で。