オーバーライド
サブクラスはスーパークラスのメンバーを継承することができますが、状況によってはスーパークラスの処理の内容を変更しなくてはならない場合があります。サブクラス側で同じメソッド名でかつ、同じシグネチャ(引数の構成)のメソッドを再び定義することができます。これをメソッドのオーバーライド(override)と呼びます。
例えば、Carクラスでは、スピードの制限がありません。無限にスピードが出るように設計されています。しかし、Busではスピードの制限を設けないと危険なので、速度の制限を設けたいと思います。
○ プログラム
次のようにBusクラスにspeedUpメソッドを追加してください。
Bus.java
- public class Bus extends Car{
- //フィールド
- private int salesAmount; //運賃
- private int passengerNumber; //乗客人数
- //フィールドのgetterの準備
- public int getSalesAmount(){
- return this.salesAmount;
- }
- public int getPassengerNumber(){
- return this.passengerNumber;
- }
- //加速させるメソッド
- public void speedUp(int sp){
- //スピードが60km以下なら加速する
- if((this.getSpeed() + sp) <= 60){
- super.speedUp(sp);
- }
- }
- }
○ クラス図
○ コンパイルと実行
C:¥work>javac Bus.java
C:¥work>java BusTest
スピード:0km
ガソリン:150.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:5km
ガソリン:149.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:10km
ガソリン:149.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:15km
ガソリン:148.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:20km
ガソリン:148.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:25km
ガソリン:147.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:30km
ガソリン:147.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:35km
ガソリン:146.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:40km
ガソリン:146.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:45km
ガソリン:145.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:50km
ガソリン:145.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:55km
ガソリン:144.5L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:60km
ガソリン:144.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:1
スピード:60km
ガソリン:144.0L
売上金額:0円
乗車人数:0人
1)加速 2)減速 3)給油 7)乗車 8)降車 9)終了:9
C:¥work>
○ 解説
63~68行目では、speedUpメソッドを再定義しています。このメソッドは、加速後のスピードが60km/h以下ならスーパークラスであるCarクラスのspeedUpメソッドを呼び出して加速しています。superキーワードはスーパークラスを指すので、super.XXと指定することでスーパークラスのメンバーを指定することができます。
プログラムの修正はこれで終了です。Busクラスを利用するプログラムは修正をしませんが、60km/hまでしかスピードが出ないようになっています。これは実際のバスの運転手がバスのアクセルを踏むとリミッターが作動して、60kmまでしかスピードが出なくなる状況と似ています。もしオーバーライドができないと次のようにメソッドを用意することになるかもしれません。
上の図の例だとBusクラスを利用する側では「speedUp」と「speedUpForBus」というメソッドのどちらを呼び出すかを選択することになります。実際のバスの例だと、無限にスピードが出るアクセルと、60kmまでしかスピードが出ないアクセルが2つ並んでいる状態ということができます。バスの操作説明書には、「アクセルは2つありますが、必ず60㎞/hまでしかスピードが出ないアクセルを踏むようにしてください」とあったとしても、操作ミスで無限にスピードが出るアクセルを踏んでしまうかもしれませんし、スピード狂の運転手であれば、リミッターのかからない(無限にスピードが出る)アクセルをあえて踏むかもしれません。
オーバーライドでspeeUpメソッドを再定義することにより、実際のバスでアクセルは1つあるという状態を作り出すことができます。これにより、バスを安全に運用してもらうことが可能になりますし、運転手を再教育する必要はなくなるということになります。それは、使用している部品がバージョンアップしても、使い方は変わらない(プログラムを変更しなくてもよい)ということになります。