キッチンでプログラミング(11)
今回は継承を取り上げたいと思います。
【親と子のクラスを作ろう(その1)】
ビットさんが言いました。「今日はチキンカレーを作りましょう。」
はじめ君が言いました。「わーい、カレーだ、うれしいな。」
かなたちゃんが言いました。「どうやって作るの。」
ビットさんが言いました。「クリームシチューの作り方を覚えているかしら。あれを参考にしてチキンカレーの作り方をオブジェクト指向で書いてみて。」
かなたちゃんが言いました。「私、やってみる。」
そしてできたのが、次のようなクラスを使った作り方です。
~クラス~
<名前>
チキンカレーを作るロボット
<属性>
材料1 ← 玉ねぎ
材料2 ← じゃがいも
材料3 ← にんじん
材料4 ← とり肉
<操作>
切る(){
this.材料1を2cm角に切る。
this.材料2を2cm角に切る。
this.材料3を2cm角に切る。
this.材料4を2cm角に切る。
}
炒める(){
鍋に油大さじ1を入れる。
鍋にthis.材料1を入れる。
鍋にthis.材料2を入れる。
鍋にthis.材料3を入れる。
鍋にthis.材料4を入れる。
火をつける。
炒める。
}
煮る(){
鍋に水700mlを入れる。
時間を25にする。
時間>0の間
1分待つ。
時間から1引く。
}
味付けする(){
カレーのルーを入れる。
まぜる。
}
もりつける(人数){
人数分のお皿に料理をもりつける。
}
~~~~~~~~~~
~作り方~
1.料理ロボA ← 『チキンカレーを作るロボット』インスタンスを新しく生み出す。
2.料理ロボA.切る()
3.料理ロボA.炒める()
4.料理ロボA.煮る()
5.料理ロボA.味付けする()
6.料理ロボA.もりつける(3)
~~~~~~~~~~
ビットさんが言いました。「かなたちゃん、何か気づいたことはあるかしら。」
かなたちゃんが言いました。「クリームシチューの作り方とチキンカレーの作り方は味付けが違うだけで他は同じでいいと思ったわ。」
はじめ君が言いました。「それじゃあ『クリームシチューを作るロボット』のクラスは今日かなたちゃんが作った『チキンカレーを作るロボット』のクラスをコピペして、名前と味付けする()のところを変えるだけでできちゃうね。』
ビットさんが言いました。「そんなに都合よくはいかないのよ。2つのクラスは『味付けする()』以外一緒でしょ。だから、もしこの部分に変更が必要になったら、忘れずに両方のクラスを修正しなきゃいけないわよね。今はまだ2つだからいいけど、トマトシチューだとかみそシチュー(?)だとかいろいろ増えたら管理もできなくなって大変なのよ。そこで、継承(けいしょう)という機能を使うの。継承っていうのはね、クリームシチューもチキンカレーも煮込み料理の一種だと考えるの。そして、煮込み料理っていうクラスを定義しておいてクリームシチューとチキンカレーで違うところだけそれぞれのクラスで定義するという考え方なの。この時、煮込み料理を親クラス、クリームシチューやチキンカレーを子クラスと呼ぶの。」
~親クラス~
<名前>
煮込み料理を作るロボット ・・・ 抽象クラス
<属性>
材料1 ← 玉ねぎ
材料2 ← じゃがいも
材料3 ← にんじん
材料4 ← とり肉
<操作>
切る(){
this.材料1を2cm角に切る。
this.材料2を2cm角に切る。
this.材料3を2cm角に切る。
this.材料4を2cm角に切る。
}
炒める(){
鍋に油大さじ1を入れる。
鍋にthis.材料1を入れる。
鍋にthis.材料2を入れる。
鍋にthis.材料3を入れる。
鍋にthis.材料4を入れる。
火をつける。
炒める。
}
煮る(){
鍋に水700mlを入れる。
時間を25にする。
時間>0の間
1分待つ。
時間から1引く。
}
味付けする() ・・・ 抽象メソッド
もりつける(人数){
人数分のお皿に料理をもりつける。
}
~~~~~~~~~~
~子クラス~
<名前>
チキンカレーを作るロボット
<親クラスの名前>
煮込み料理を作るロボット
<操作>
味付けする(){
カレーのルーを入れる。
まぜる。
}
~~~~~~~~~~
「子クラスを定義するときは、自分がどのクラスの子クラスかわかるように、親クラスの名前を書くことになっているの。」
~作り方~
1.料理ロボA ← 『チキンカレーを作るロボット』インスタンスを新しく生み出す。
2.料理ロボA.切る()
3.料理ロボA.炒める()
4.料理ロボA.煮る()
5.料理ロボA.味付けする()
6.料理ロボA.もりつける(3)
~~~~~~~~~~
ビットさんが言いました。「子クラスのインスタンスを新しく生み出すとき、まず、親クラスのインスタンスが自動的に生み出されるのよ。」
「子クラスで定義されていない操作は、親クラスの操作を行うの。そして、親クラスと子クラスで違う操作が定義されている場合は、子クラスで定義されている操作を行うの。これをオーバーライドと言うのよ。」
「『煮込み料理を作るロボット』クラスではどんな味にしたらいいかわからないので、処理のないメソッドにしておくの。これを抽象メソッドと言うわ。そして、抽象メソッドを含むクラスは抽象クラスとなり、インスタンスを作ることができないの。抽象メソッドは実行することができないからね。
はじめ君が言いました。「むずかしくて、よくわからないよ。」
「そうね。すぐにはわからないかもしれないわね。」ビットさんが言いました。
【解説】
ここでは親クラスと子クラスの継承を取り上げましたが、多階層の継承も定義できます。上の階層にいくほど抽象的で、下の階層に行くほど具体的になります。ここで注意しなければならないのが、一番下の階層のクラスしかインスタンス化できないということです。
順序が逆になってしまいましたが、次章ではもっと簡単な継承の例を取り上げたいと思います。
この記事が気に入ったらサポートをしてみませんか?