1. 程式人生 > >6:多型

6:多型

什麼是多型?

第一句話:一段程式碼,一個函式,一個類的多型性
第二句話:一段程式碼,一個函式,一個類的靈活性

  • 從生活中說:轎車,會開車的人都會開,人會開車,那麼人可以開車,人猿會開車,那麼人猿可以開車,如果說,轎車只能讓人開,那是不是人猿就得創造一種猿車,專門供人猿開呢?這不是造成了資源的浪費嗎?
  • 從程式中說:一個類,只負責輸出字串,那麼我要是給你傳一個物件的引數呢?你怎麼辦,你怎麼給我顯示這個物件,再寫一個專門輸出物件的類?那你的程式碼要寫多少行?別人理解你的程式碼得耗費多少時間?這難道不是金錢的損失嗎?
  • 多型這個東西,沒有什麼具體的語言能具體描述,他就是說一個東西的靈活性好不好,而且,面向物件(OOP)本身就是為了提高效率,一定程度上簡化程式碼,達到複用的目的;

示例:

class Shoudiantong {
	public function ons(Glass $g){
		$g->display();
	}
}

class Glass {
	public function display(){}
}

class Hong extends Glass{
	public function display(){
		echo '紅玻璃 <br/>';
	}
}

class Blue extends Glass{
	public function display(){
		echo '藍玻璃 <br/>';
	}
}

class Tianpeng{
	public function display(){
		echo '天蓬元帥 <br/>';
	}
}

$shoudiantong = new Shoudiantong();

$hong = new Hong();

$blue = new Blue();

$tianpeng = new Tianpeng();

$shoudiantong->ons($hong);
$shoudiantong->ons($blue);

註釋

  • 輸出一句話,只有Glass類的子類才能被呼叫方法;

  • 子類是父類,正如男人是人,女人是人,金魚是魚,鯊魚是魚,千里馬也是馬;

  • 里氏代換:原能用父類的場合,都可以用子類來代替

  • PHP本身不進行引數型別檢測,在PHP5.3以後,引入了物件型別的引數檢測,僅僅是在引數為物件的時候,型別檢測生效,普通的基本資料型別是不進行檢測的;

  • 多型在弱型別的語言中(例如JavaSscript PHP Python)的存在感不是那麼強烈,但是在強型別的語言中(例如Java CPP C# C)顯示的表現就很強烈

  • 重在思想,不在語法;