オーバーライド

 サブクラスはスーパークラスのメンバを継承することができますが、状況によってはスーパークラスの処理の内容を変更しなくてはならない場合があります。サブクラス側で同じメソッド名でかつ、同じシグネチャ(引数の構成)のメソッドを再び定義することができます。これをメソッドのオーバーライド(override)と呼びます。

 例えば、Carクラスでは、スピードの制限がありません。基本的に無限にスピードが出るように設計されています。しかし、Busではスピードの制限を設けないと危険なので、速度の制限を設けたいと思います。

Busクラスでオーバーライド
Busクラスでオーバーライド

サンプルダウンロード

○ プログラム

 次のようにBusクラスにspeedUpメソッドを追加してください。

Bus.java

  1. class Bus extends Car{
  2.  //フィールド==========
  3.  private int salesAmount;     //運賃
  4.  private int passengerNumber;     //乗客人数
  1.  //フィールドのgetterの準備
  2.  public int getSalesAmount(){
  3.   return this.salesAmount;
  4.  }
  5.  public int getPassengerNumber(){
  6.   return this.passengerNumber;
  7.  }
  8.  //加速させるメソッド
  9.  public void speedUp(int sp){
  10.   //スピードが60km以下なら加速する
  11.   if((this.getSpeed() + sp) <= 60){
  12.    super.speedUp(sp);
  13.   }
  14.  }
  15. }

○ クラス図

○ 解説

 63~68行目でspeedUpメソッドを再定義しています。このメソッドは加速後のスピードが60km/h以下ならスーパークラスであるCarクラスのspeedUpメソッドを呼び出して加速しています。superキーワードはスーパークラスを指すので、super.XXと指定することでスーパークラスのメンバを指定することができます。

 プログラムの修正はこれで終了です。Busクラスを利用するプログラムは修正をしませんが、60km/hまでしかスピードが出ないようになっています。これは実際のバスの運転手がバスのアクセルを踏むと自動的に60kmまでしかスピードが出なくなる状況と似ています。もしオーバーライドができないと次のようにメソッドを用意することになるかもしれません。

オーバーロードを使わないと…
オーバーロードを使わないと…

 上の図の例だとBusクラスを利用する側では「speedUp」と「speedUpForBus」というメソッドのどちらを呼び出すかを選択することになります。実際のバスの例だと、無限にスピードが出るアクセルと、60kmまでしかスピードが出ないアクセルが2つ並んでいる状態ということができます。バスの操作説明書には、「アクセルは2つありますが、必ず60㎞/hまでしかスピードが出ないアクセルを踏むようにしてください」とあったとしても、操作ミスで無限にスピードが出るアクセルを踏んでしまうかもしれませんし、スピード狂の運転手であれば、リミッターのかからない(無限にスピードが出る)アクセルをあえて踏むかもしれません。

 オーバーライドでspeeUpメソッドを再定義することにより、実際のバスでアクセルは1つあるという状態を作り出すことができます。これにより、バスを安全に運用してもらうことが可能になりますし、運転手を再教育する必要はなくなるということになります。それは、使用している部品がバージョンアップしても、使い方は変わらない(プログラムを変更しなくてもよい)ということになります。

前へ   次へ