オーバーライド(親クラスのメソッドの上書)

オーバーライドとは

継承元の親クラスからメソッドを上書きして追加機能を備え付けられる。


php

<?php 
class PriceSetting{
	protected $price;
	
	public function getPrice(){
		return $this->price;
		}
	
	public function setPrice($price){
		$this->price = $price;
		}
	}

//PriceSettingを継承
class Product extends PriceSetting{
	
	//消費日数を10日以内に設定
	private $limit = 10;
	
	public function getLimit(){
		return $this->limit;
		}
	
	public function lapse(){
		$this->limit--;
		return $this->getLimit();
		}
	
	//PriceSettingからgetPriceをオーバーライド
	public function getPrice(){
		$price = $this->price;
		if($this->limit <= 5){
			$price = $price / 2;
			}
		return $price;
		}
	}

$newPrice = new Product();
//価格設定
$newPrice->setPrice(300);

//設定の消費日数が5日以内になったら価格調整する仕様
$limit = $newPrice->getLimit();
while($limit > 0){
	if($limit >= 6){
	echo '消費期限が'.$limit.'日残っています。現在の商品価格は'.$newPrice->getPrice().'円です<br>';
	}else{
	echo '消費期限が'.$limit.'日になりました。よって商品価格は'.$newPrice->getPrice().'円です<br>';	
	}
	$limit = $newPrice->lapse();
	}
?>



出力結果

消費期限が10日残っています。現在の商品価格は300円です
消費期限が9日残っています。現在の商品価格は300円です
消費期限が8日残っています。現在の商品価格は300円です
消費期限が7日残っています。現在の商品価格は300円です
消費期限が6日残っています。現在の商品価格は300円です
消費期限が5日になりました。よって商品価格は150円です
消費期限が4日になりました。よって商品価格は150円です
消費期限が3日になりました。よって商品価格は150円です
消費期限が2日になりました。よって商品価格は150円です
消費期限が1日になりました。よって商品価格は150円です

親クラスのメソッドgetPrice()
"消費日数により価格変更して返す機能"を上書きしました。
ただ、これだと本来のメソッド、”価格を返す”機能が呼び出せなくなったのでしょうか?

親クラスのメソッドを活かしたままオーバーライド

上述のオーバーライドはあくまでも、その時だけ上書きされた機能が優先されるだけであり、本来の機能はちゃんと生きています。
それでは、親クラスの機能を維持したまま、追加機能を書き加えるには、参照時に再度親クラスの機能を書いた上で追加機能を追記していくのですが、それだと効率が悪いので以下の通りにします。


php

<?php 
class PriceSetting{
	protected $price;
	//割引率を追加
	protected $discountRate = 0.5;
	
	public function getPrice(){
		//割引価格を算出して返す
		return $this->price - ($this->price * $this->discountRate);
		}
	
	public function setPrice($price){
		$this->price = $price;
		}
	}

//PriceSettingを継承
class Product extends PriceSetting{
	
	//消費日数を10日以内に設定
	private $limit = 10;
	
	public function getLimit(){
		return $this->limit;
		}
	
	public function lapse(){
		$this->limit--;
		return $this->getLimit();
		}
	
	//PriceSettingからgetPriceをオーバーライド
	public function getPrice(){
		//"parent::"を付け加えて親クラスのメソッドが変更されないまま呼び出す。
		$price = parent::getPrice();
		if($this->limit <= 5){
			$price = $price / 2;
			}
		return $price;
		}
	}

$newPrice = new Product();
//価格設定
$newPrice->setPrice(300);

//設定の消費日数が5日以内になったら価格調整する仕様
$limit = $newPrice->getLimit();
while($limit > 0){
	if($limit >= 6){
	echo '消費期限が'.$limit.'日残っています。現在の商品価格は'.$newPrice->getPrice().'円です<br>';
	}else{
	echo '消費期限が'.$limit.'日になりました。よって商品価格は'.$newPrice->getPrice().'円です<br>';	
	}
	$limit = $newPrice->lapse();
	}
?>



出力結果

消費期限が10日残っています。現在の商品価格は150円です
消費期限が9日残っています。現在の商品価格は150円です
消費期限が8日残っています。現在の商品価格は150円です
消費期限が7日残っています。現在の商品価格は150円です
消費期限が6日残っています。現在の商品価格は150円です
消費期限が5日になりました。よって商品価格は75円です
消費期限が4日になりました。よって商品価格は75円です
消費期限が3日になりました。よって商品価格は75円です
消費期限が2日になりました。よって商品価格は75円です
消費期限が1日になりました。よって商品価格は75円です

このように"parent::"を付け加えた参照で親機能を維持しつつ、追加機能を書き加えます。