什麼是多態性?
多態性是繼資料庫抽象和繼承後,物件導向語言的第三個特徵。多態即多種形態,具有表現多種形態的能力特徵。在物件導向中表示根據對象的類型以不同方式處理。多態性允許每個對象以適合自身的方式去響應共同的訊息。多態性增強了軟體的靈活性和重用性。
如我們建立一個doing()方法,如果是學生則列印上課,如是公司職員則列印上班。
普通做法
使用if判斷
/** * PHP多態性 */ // 定義學生類class student{ public function cla(){ echo "學生工正在上課!<br />"; }} // 定義職員類class office{ public function Wor(){ echo "職員正在上班!<br />"; }} // 判斷物件類型方法function doing($obj){ if($obj instanceof student){ $obj->cla(); }elseif($obj instanceof office){ $obj->wor(); }else{ echo "沒有這個對象!"; }} doing(new student()); // 學生正在上課doing(new office()); // 職員正在上班
以上結果輸出:
學生正在上課
職員正在上班
這種普通方法有個缺點,就是對象如果很多,那麼if..else..很長,不靈活。
多態性做法
定義一個公用抽象方法,所有子類繼承它。
/** * PHP多態性 */ // 定義一個公用類class pub{ protected function working(){ echo "本方法需要在子類中重載!"; }} // 定義學生類,繼承公用類pubclass student extends pub{ public function working(){ echo "學生工正在上課!<br />"; }} // 定義職員類,繼承公用類pubclass office extends pub{ public function working(){ echo "職員正在上班!<br />"; }} // 判斷物件類型方法function doing($obj){ if($obj instanceof pub){ $obj->working(); }else{ echo "沒有這個對象!"; }} doing(new student()); // 學生正在上課doing(new office()); // 職員正在上班
這就是多態的特性,靈活重用。
其它做法
從多態性的實現方式來看,無非就規範了每個類都要重載父類的一個方法,從而達到統一效果。而我們在定義類的時候,自行加上統一的方法也可行。因此以上例子也可以這麼實現:
/** * PHP多態性 */ // 定義學生類class student{ // 定義統一的方法pub public function pub(){ echo "學生工正在上課!<br />"; }} // 定義職員類class office{ // 定義統一的方法pub public function pub(){ echo "職員正在上班!<br />"; }} // 判斷物件類型方法function doing($obj){ if($obj){ // 調用類的統一方法 $obj->pub(); }else{ echo '沒有這個對象'; }} doing(new student()); // 學生正在上課doing(new office()); // 職員正在上班
多態性也可以理解為一種程式設計方式,而程式設計最終目的無非就是:靈活,多態,重用,高效。