オーバーライド

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

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

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

○ ファイル

 Busクラスにメソッドを追加しましょう。

ファイルの種類 PHPファイル
ファイル名 Bus.php

サンプルダウンロード

○ プログラム

 次のようにプログラムを追加してください。

Bus.php

  1.  //降車させるメソッド
  2.  public function getOffBus(){
  3.   if($this -> getSpeed() != 0){
  4.    return '停車してください。';
  5.   }
  6.   //乗客がいるかどうか
  7.   if($this -> passengerNumber == 0){
  8.    return '乗客はいません。';
  9.   }
  10.   //乗車人数を減算
  11.   $this -> passengerNumber--;
  12.   return null;
  13.  }
  14.  //加速させるメソッド(オーバーライド)
  15.  public function speedUp($sp){
  16.   if(($this ->getSpeed() + $sp) <= 60){
  17.    parent::speedUp($sp);
  18.   }
  19.  }
  20. }

○ クラス図

○ 解説

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

○ ファイル

 60km/h以上スピードが出ないかどうかを確認してみましょう。「InheritanceTest.php」ファイルをコピーして、「OverrideTest.php」を作成してください。

ファイルの種類 PHPファイル
ファイル名 OverrideTest.php

○ プログラム

 次のように修正してください。

OverrideTest.vb

  1. //インスタンスを生成する
  2. $bus = new Bus(150);
  3. for($i=0; $i<5; $i++){
  4.  //加速してみる
  5.  print('加速します!<br>');
  6.  $bus -> speedUp(20);
  7.  showData($bus);
  8.  print('<hr>');
  9. }

○ 解説

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

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

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

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

前へ   次へ