プログラミングの知識ゼロでもわかる "オブジェクト指向" ② 便利な使い方紹介: 継承

こんにちは。
4月より新卒プログラマーになった島田文平と申します。

以前、[プログラミングの知識ゼロでもわかる "オブジェクト指向"](http://qiita.com/BumpeiShimada/items/ca47f648100764747c94) という記事で、
本来はプログラミングとは関係のない概念だった "オブジェクト指向" の説明を、
専門用語無しで記述させて頂きました。

上記の記事内で
> “オブジェクト指向” の下に作られたプログラミング言語は、
> IT業界で行われていた多くの仕事にとって非常に都合がいい。

という旨を申し上げました。
この記事ではその発展という形で、

### 「"オブジェクト指向" がプログラミングに概念として入ると、一体どう都合がいいのか?」
<br>
という点を記述させて頂きたいと思います。
今回もまた、プログラミングの事前知識無しでも理解できるよう、
専門用語一切なしで記述致します。

オブジェクト指向プログラミング言語の利点、
及び "継承" の概念の理解の一助となれば幸いでございます。

<br>
---
<br>

さて、まずは例え話から始めさせて下さい。
### __3匹の動物をプログラミングする__ ことを考えてみてください。
<br>
動物は

- サル
- ウシ
- ゾウ

です。

3匹それぞれを "オブジェクト" とすることでプログラミングする、
という仮定で進めさせて頂きます。

冒頭に書いてある [以前の記事](http://qiita.com/BumpeiShimada/items/ca47f648100764747c94) では、何かを "オブジェクト" として扱うとはどういうことか、
という点を、__机__ を例に以下のようにまとめさせて頂きました。
<br>
> 机を “オブジェクト” としてみなすのであれば、
> ・机はどのような色や形をしているのか (机が持っている要素)
> ・机では一体何ができるのか
> の両者がセットで、かつ明確に定義されていなければならない。

<br>
今回、動物をプログラミングする際のルールとして、
以下の __"要素"__ および __"できること"__ がそれぞれの動物に含まれていなければならない
として進めていきます。
<br>

### 3匹の動物はそれぞれ...  
<br>
__"要素"__ として

- 足が4本生えている
- 耳が2つある
- 目が2つある
- 心臓が1つある

__"できること"__ として

- __(それぞれの方法で)__ 鳴くことができる
- __(それぞれの方法で)__ 食べることができる
- 歩くことができる
- 寝ることができる

<br>

さて、上記のルールを全て当てはめると、
どのようにプログラミングをすることになるでしょうか。

まずはサルからプログラミングしてみましょう。

以下、ちょっとだけ 「プログラミングっぽい」 書き方をしてみます。
<br>

```lang:MONKEY
おサルさん {

  足が4本生えている
  耳が2つある
  目が2つある
  心臓が1つある

  「ウキー」と鳴くことができる
  「手を使って」食べることができる
  歩くことができる
  寝ることができる

}
```

続けて、ウシ、ゾウも書いていきます。


```lang:COW
ウシ {

  足が4本生えている
  耳が2つある
  目が2つある
  心臓が1つある

  「モー」と鳴くことができる
  「口だけ使って」食べることができる
  歩くことができる
  寝ることができる

}
```

```lang:ELEPHANT
ゾウさん {

  足が4本生えている
  耳が2つある
  目が2つある
  心臓が1つある

  「パオーン」と鳴くことができる
  「鼻を使って」食べることができる
  歩くことができる
  寝ることができる

}
```

<br>
...さて、ひとまずプログラミングが完了しました。

少しだけ、昔のことをお話させてください。
[以前の記事](http://qiita.com/BumpeiShimada/items/ca47f648100764747c94) で、このような事が記述されていました。

> 数十年前にあるプログラマーたちが
> 「 “オブジェクト” の考えを導入したら、__もっといいプログラミング__ が出来るのでは?」
> と考えたことが Java などのオブジェクト指向プログラミング言語誕生のきっかけだった。

<br>
ここで言う __もっといいプログラミング__ とはどのようなものか。
その答えのひとつは、__余分な繰り返しをしなくていい__ ということです。

先ほど、3匹の動物をプログラミングしたことを思い出してください。

- 足が4本生えている
- 耳が2つある
- 目が2つある
- 心臓が1つある
- 歩くことができる
- 寝ることができる

これら6つの "要素" と "できること" は、全ての動物に共通でした。

__もっといいプログラミング__ とは、__余分な繰り返しをしなくていい__ ということ。

オブジェクト指向の考え方を用いれば、
わざわざ上記の6つを繰り返し書かなくて済むようになります。

そうなると、どのように書くことになるのでしょうか?

まずは、共通する部分を全てまとめてプログラミングしてしまいましょう。
サルもゾウもウシも "動物" なので、名前は 動物 にします。

<br>

```lang:ANIMAL
動物 {

  足が4本生えている
  耳が2つある
  目が2つある
  心臓が1つある

  歩くことができる
  寝ることができる

}
```

数十年前のあるプログラマーたちは、
 
__動物であることを示しさえすれば、__

- 足が4本生えている
- 耳が2つある
- 目が2つある
- 心臓が1つある
- 歩くことができる
- 寝ることができる

__という "要素" と "できること" があるということを、
コンピューターが勝手に判断してくれる機能をつけよう。__

と思いつきました。

言い換えると、

__上記の "動物" をプログラミングした上で、
"サル" などをプログラミングする際に__
> 動物 である サル

__といった事を書けば
上記の6つをわざわざ書かなくてもいいようにしたのです。__

それでは改めまして、先人たちの工夫に敬意を表し、
3匹の動物をプログラミングしなおしてみましょう。
<br>

```lang:MONKEY
動物 である おサルさん {

  「ウキーッ」 と鳴くことができる
  「手を使って」 食べることができる
}
```
```lang:COW
動物 である ウシ {

  「モー」 と鳴くことができる
  「口だけを使って」 食べることができる
}
```
```lang:ELEPHANT
動物 である ゾウさん {

  「パオーン」 と鳴くことができる
  「鼻を使って」 食べることができる
}
```

<br>
かなりスッキリしました。

加えて、何が全ての動物に共通で、
何がそれぞれの動物独自に持っているものなのかが明確になりました。

今行ったことは、
__"サル"、"ウシ"、"ゾウ" が "動物" を継承した__
と言い換えることが出来ます。

これが、オブジェクト指向プログラミング言語で使うことのできる
"継承" になります。

<br>
---
<br>

もうちょっとだけ、仮定の話にお付き合いください。

今、3匹の動物のプログラミングが完了しました。

今日調子のいいあなたは、
「せっかくだからもっと沢山プログラミングしちゃおう!」
と、頑張ってみました。

あなたはすっかり熱中してしまい、
日の暮れた頃には動物100匹分のデータがプログラミングされていました。

「鳴き声と食べ方がいっぱい記録されてる、ちょっとした図鑑ができちゃった」

と上機嫌のあなたは、満足して眠りにつきました。

<br>

...そして次の日、あなたはこう思いつきます。

__「あれ? 動物ってたしか、みんな鼻が付いてるよね?」__

ここであなたは、以前プログラミングしたものを以下のように書き換えました。
<br>

```lang:ANIMAL
動物 {

  鼻が付いている    ←   これを書き足した
  足が4本生えている
  耳が2つある
  目が2つある
  心臓が1つある

  歩くことができる
  寝ることができる

}
```

あっという間にプログラミングは完了です。
何も問題はございません。

しかし仮に、オブジェクト指向でプログラミング __していなかったら__ どうなっていたでしょう?

今回はオブジェクト指向由来の "継承" のおかげで、
たった一行書き足すだけで終わりましたが、
もし "継承" が無かったらそれぞれの動物の "要素" に書き足していかなければいけません。

動物は100匹もいます。

#### __つらいです。__

<br>
「オブジェクト指向の考え方でプログラミングができて本当に良かったなあ」

と胸を撫で下ろし、今日もあなたはプログラミングに励むのでした...

<br>
---
<br>

__最後までお読み頂きありがとうございました。__

私はまだまだプログラミングを始めたばかりなので、この記事をお読みになっていて

「ここ間違ってるよ」
「ここはこう変えればもっと良くなるよ」

と思われた方もいらっしゃると思います。

もしそういったものがありましたら、以下のコメント欄等にてご指摘頂けると
非常に助かります。

Twitter でも気軽にリプライして頂けると嬉しいです。
→ [@curryisdrink](https://twitter.com/curryisdrink)

これからも何卒よろしくお願い致します。

島田