Androidアプリを作ってみる #16 -クラスの継承-

Androidアプリを作る前の知識編 その2

クラスの拡張機能

前回からAndroidアプリを作る前の前提知識として、Javaのことをお勉強しました。まだちょっとそれが続きます。

にゃんこ
ええええーー。
メリ
寝てようかしら。
本Blogの内容を試して、トラブルや故障の原因になったとしても責任は負えません。そんな危ないことはしていませんが、自己責任でお願いしますね。

前回は「クラス」の基本的なことをやりましたが、この「クラス」にはプログラミングを楽にするいい機能があるんです。っと言っても楽になるか余計に複雑になるかは本人次第なんですけどね…。

それを「継承」と言います。

前回の記事

Androidアプリを作ってみる #15 -クラスとは-

2016.11.23

継承の使いどころ

同じ機能を持った違うキャラ

例えば、前回登場した「Mario」クラス。これに似たクラスで「Luigi」を作りたいとなったとしましょう。そうなった時にどうするかってほとんどの人は「Mario」クラスをコピペして以下のようにクラス名だけ変えますよね。その方が楽だし。

「Luigi」クラスは、ジャンプだけは「Mario」より高く飛べるように書いておけばこれでOKな感じですね。これならこのままでもいいような気がします。「Luigi」の方がジャンプ力が高いのであれば、ここで個別にjump()メソッドを書き換えればいいわけですしね。

にゃんこ
じゃ、これで終了?
メリ
嘘っ!?

基本が変わった時に問題が…

コピペすると、簡単に新しいクラスが作れますが、例えば「Mario」の歩く速度が遅いってことで、歩く処理のwalk()メソッドを変更したとしましょう。walk()メソッドは「Luigi」クラスでも共通の処理ですが、いくら「Mario」クラス側で変更したからと言って「Luigi」クラス側のwalk()も変更してくれるわけではないんです。当たり前ですけど、Javaからしたら「Luigi」クラスは名前の違う別のクラスでしかありません。ただ、この程度の数だったらいいですけど、キャラクターが何十人も「Mario」のようなのがいて、それぞれが全員共通のwalk()を持っていたら大変ですよね?想像しただけでも面倒ですし、これって絶対に変更のし忘れが起こります

メリ
ワタシは大丈夫よ。
にゃんこ
何が?

こんな時に、「継承」が力になってくれます。



継承のやり方

基底クラスを作る

まず、基底クラスというものを作ります。「Mario」や「Luigi」のベースになるもののクラスってことです。この基底クラスには「Mario」「Luigi」の共通の処理を入れておきます。

基底クラス:スーパークラスとも言います。言い方は好きな方でいいです。
にゃんこ
余計なお世話。

クラス名は「Character」にしました。これが「Mario」「Luigi」が共通して持つ機能ですね。これを「継承」することで、bDash()walk()は全く同じものとして使うことができます。

基底クラスを継承する

今度はこの基底クラスを継承した「Mario」クラスを作ります。

一行目のクラス宣言の後ろに「extends」がありますね。その後にさっきの基底クラス「Character」があります。こうすることで「Character」クラスを継承した「Mario」クラスを作ることができます。「Luigi」クラスも同様の方法で作ると「Mario」「Luigi」クラスには書いてないbDash()walk()が使えるようになっています。もちろん、ここで歩く速度を変えたいということで「Character」クラスのwalk()を変更するとそれぞれでその変更が反映されてます。あら、便利ですね。

そして、それぞれの個別の特徴的な機能は継承した「Mario」「Luigi」クラスで付け足していけばいいんです。例えばjump()は「Luigi」クラスでは高めに飛べるとかね。実体にして使いたい時も同じように書いていけばいいんです。

にゃんこ
まんまアレじゃん。
メリ
やばくないのかしら。

もっと継承したい

継承の継承もできます

ここで「Mario」がキノコを取った場合どうなるでしょか?

ま、当然大きくなるね。そうなった場合にやりたいのが「Mario」を継承して、「SuperMario」を作りたいって衝動です。

にゃんこ
いよいよ本格的にやばいかも。

これもできます。「Mario」の機能を持った「SuperMario」も作れます。やり方も同じように「extends」を使えばよろし。

でも、一つ問題が出てきませんかね?この場合。

共通の機能を書き換えたい

オーバーライドとかってのがある

そう、「SuperMario」になると、ジャンプ力は違う、ブロックは崩せるなど基本的な機能って変わっていきますよね?

じゃ何か、またさっきのコピペに戻るのかってそうじゃありません。ちゃんと大丈夫な機能があります。その名も「オーバーライド」です。オーバーライドは訳の通りの「上書き」です。これは元々の共通の処理を継承先で書き換えてしまおうというものです。だから、ジャンプ力を変えたければ「SuperMario」クラスで以下のようにjump()を新たに書いてしまえばいいのです。

最近のJavaでは、オーバーライドするときに以下のようにするみたいですが。

こうすることで、元々のjump()ではなくて「SuperMario」独自のjump()を呼び出すことができます。もちろん書き方も特別なものではなくいつも通りです。

これで晴れて「SuperMario」クラスが作れましたね。今回のようにうまく「継承」を使えば、無駄な作業を減らすこともできるし、機能の変更し忘れなんてものがなくなるので便利ですね。

じゃ、今回はここまで。

メリ
今回はなんか分かった気が
にゃんこ
嘘つけ!

次の記事

Androidアプリを作ってみる #17 -Androidのライフサイクル-

2016.12.11

前回の記事

Androidアプリを作ってみる #15 -クラスとは-

2016.11.23