オブジェクト指向プログラミングの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 => "ギャリック砲"
悟空とベジータのクラスからは、「気をためる」「空を飛ぶ」といった技の記述は消えた。 しかし、サイヤ人の血を引くので、いつもどおり気をため、空を飛べる。 なぜならふたりは、サイヤ人クラスを「継承」しているから。
くわえて、それぞれかめはめ波やギャリック砲といった、「特化」した技を持っている。
超ざっくりだが、継承の例えはこんな感じ。
「ビーデルや天津飯とか、サイヤ人の血を引いてないのに空飛べる人けっこういるやん!」
などという野暮なツッコミは禁止で。