オーバーライド

オーバーライドとはなんぞ

「オーバーライド」とは、継承クラスにおいて、親クラスのメソッドを上書きする仕組みの事をいいます。

親クラスのメソッドに追加機能を持たせたい場合、または親クラスのメソッドの機能を殺したい場合などに使用します。

何かの時に継承元のメソッドを書き換えたい時があるんだろう。うん、きっと。何かの時に。

オーバーライドってどうするの?

継承クラス、子クラスで継承元の上書きしたいメソッドと同じ名前のメソッドを作ればOK

継承クラスでオーバーライドした場合

継承元クラス、親クラス よりも先に 継承クラス、子クラスを見に行く。

php で書くとこんな感じらし

継承元、親クラス
  3 class Product {
  4     protected $price;
  5
  6     public function getPrice() {
  7         return $this->price;
  8     }
  9
 10     public function setPrice($price) {
 11         $this->price = $price;
 12     }
 13 }

継承、子クラス

 15 class FoodProduct extends Product {
 16     private $expire = 15;
 17
 18     public function getExpire() {
 19         return $this->expire;
 20     }
 21
 22     public function decrementExpire() {
 23         $this->expire--;
 24         return $this->getExpire();
 25     }
 26
 27     // 価格取得のオーバーライド
 28     public function getPrice() {
 29         $price = $this->price;
 30         if($this->expire <= 10) {
 31             // 残り賞味期限が10日以下になったら半額
 32             $price = $price / 2;
 33         }
 34         return $price;
 35     }
 36 }

継承クラスを実体化、インスタンスを生成

 38 $prd = new FoodProduct();
 39 $prd->setPrice(100);
 40
 41 $expire = $prd->getExpire();
 42 while ($expire > 0) {
 43     echo '賞味期限:' . $expire .'日 価格:' . $prd->getPrice() . '<br />';
 44     $expire = $prd->decrementExpire();
 45 }

実行結果

賞味期限:15日 価格:100
賞味期限:14日 価格:100
賞味期限:13日 価格:100
賞味期限:12日 価格:100
賞味期限:11日 価格:100
賞味期限:10日 価格:50
賞味期限:9日 価格:50
賞味期限:8日 価格:50
賞味期限:7日 価格:50
賞味期限:6日 価格:50
賞味期限:5日 価格:50
賞味期限:4日 価格:50
賞味期限:3日 価格:50
賞味期限:2日 価格:50
賞味期限:1日 価格:50

と、getPrice() が上書きされると。




オーバーライドした場合 継承元、親クラスのメソッドはどうなるの?

オーバーライドした継承元クラスのメソッドを呼び出すことも可能らし
継承元クラスのメソッドを呼び出したい場合は

parent::someMethod()

継承元クラス、親クラスのメソッドを修正してみる

  3 class Product {
  4     protected $price;
  5     protected $discountRate = 0.03;
  6
  7     // 価格取得
  8     public function getPrice() {
  9         $price = $this->price - ($this->price * $this->discountRate);
 10         return $price;
 11     }
 12
 13     // 価格設定
 14     public function setPrice($price) {
 15         $this->price = $price;
 16     }
 17 }

継承クラス、子クラスを修正

 19 class FoodProduct extends Product {
 20     private $expire = 15;
 21
 22     public function getExpire() {
 23         return $this->expire;
 24     }
 25
 26     public function decrementExpire() {
 27         $this->expire--;
 28         return $this->getExpire();
 29     }
 30
 31     // 価格取得のオーバーライド
 32     public function getPrice() {
 33         $price = parent::getPrice();
 34
 35         if($this->expire <= 10) {
 36             // 残り賞味期限が10日以下になったら半額
 37             $price = $price / 2;
 38         }
 39         return $price;
 40     }
 41 }

実行結果

賞味期限:15日 価格:97
賞味期限:14日 価格:97
賞味期限:13日 価格:97
賞味期限:12日 価格:97
賞味期限:11日 価格:97
賞味期限:10日 価格:48.5
賞味期限:9日 価格:48.5
賞味期限:8日 価格:48.5
賞味期限:7日 価格:48.5
賞味期限:6日 価格:48.5
賞味期限:5日 価格:48.5
賞味期限:4日 価格:48.5
賞味期限:3日 価格:48.5
賞味期限:2日 価格:48.5
賞味期限:1日 価格:48.5

継承元、親クラスのメソッドを見にいってることが分かると。

このあたりから怪しくなってきたぞー。