什麼是多態性?
多態性是繼數據庫抽象和繼承後,面向對象語言的第三個特征。多態即多種形態,具有表現多種形態的能力特征。在面向對象中表示根據對象的類型以不同方式處理。多態性允許每個對象以適合自身的方式去響應共同的消息。多態性增強了軟件的靈活性和重用性。
如我們創建一個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 "本方法需要在子類中重載!";
}
}
// 定義學生類,繼承公共類pub
class student extends pub{
public function working(){
echo "學生工正在上課!<br />";
}
}
// 定義職員類,繼承公共類pub
class 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()); // 職員正在上班
當然,以上的例子不能說明多態性就能使用這樣的方式搞定,畢竟多態性在復雜的程序設計中,它能有效的達到靈活重用的特性。
多態性也可以理解為一種程序設計方式,而程序設計最終目的無非就是:靈活,多態,重用,高效。