程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 實例講解PHP面向對象之多態,實例講解面向對象

實例講解PHP面向對象之多態,實例講解面向對象

編輯:關於PHP編程

實例講解PHP面向對象之多態,實例講解面向對象


什麼是多態性?

多態性是繼數據庫抽象和繼承後,面向對象語言的第三個特征。多態即多種形態,具有表現多種形態的能力特征。在面向對象中表示根據對象的類型以不同方式處理。多態性允許每個對象以適合自身的方式去響應共同的消息。多態性增強了軟件的靈活性和重用性。

如我們創建一個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());  // 職員正在上班

當然,以上的例子不能說明多態性就能使用這樣的方式搞定,畢竟多態性在復雜的程序設計中,它能有效的達到靈活重用的特性。

多態性也可以理解為一種程序設計方式,而程序設計最終目的無非就是:靈活,多態,重用,高效。


面向對象 多態 是怎一回事?

面向對象這個概念,面向對象編程,是程序設計者一直追求的,以前的編程是面向過程的,不能夠做大型的項目.面向對象編程,可以說是一次革命.更適合於人的思想,人的思維,而不是按機器語言思想,進行編程! 在C#中,一切事物都是對象!其實對象不難理解,比方說:你要找老婆,老婆是個啥樣子,多大了,姓啥,做什麼工作的,交過幾個男友,等等這些都是對象(老婆)所持有特質.

談到類型轉換,這個應該不必多說!
至於說到父類對象強制轉換為子類對象,先決條件是,父類對象存在子類對象的值,也就是曾經把子類對象賦給過父類變量!
///
如果是父類對象轉換為子類對象,那調用的是父類還是子類的方法呢(或屬性)?

這個就不好說了,要說清楚,要花上一段時間!牽到的問題比較多,子類中是不是隱藏,重寫,父類的方法, 再說,父類是抽象類,還是接口,等等,這要具體問題具體分析!
最好把你的代碼貼出來,以助你分析!

以上是我的理解,要是有誤,請海涵!
 

面向對象中的多態的理解

簡單來說,多態是具有表現多種形態的能力的特征,在OO中是指,語言具有根據對象的類型以不同方式處理之,特別是重載方法和繼承類這種形式,的能力。多態被認為是面向對象語言的必備特性。

多態有多種分類,通過了解這些分類可以更豐滿對其認識,在這裡就不再羅列,請各位參考 wiki大百科 和 javaworld .

多態與泛型(generic)

多態實際上就是泛型。

所謂泛型就是指我們不為特定的類型進行專門編碼,而采用對不同類型進行通用編碼的方式,無論是數據結果還是算法。

傳統的泛型是指類似以Template function的方式使參數一般化,典型的應用是C++ STL,比如List、Vector以及algorithm。

而OO已能通過接口(Interface)和抽象類(Abstract Class)進行真正意義上的泛型了。在我看來,這就是OO最精彩的地方,也就是多態的威力。而對於傳統意義上的Generic,我始終覺得其作用已經今不如昔了。

多態和繼承(Inheritance)

嚴格來說,多態與繼承、重載並不是孤立的,他們之間存在著緊密的聯系,多態是建立在這兩者的基礎之上的(實際上繼承就有用重載這一特性)。

傳統的多態實際上就是由虛函數(Virtual Function)利用虛表(Virtual Table)實現的(早期C模擬OO特性時使用最多,C++的實現也是,後來的技術未作研究,是否使用VT不得而知),自然是離不開繼承,換句話說多態實際上覆蓋了繼承。

正是由於繼承與多態的緊密聯系,使得我們很容易張冠李戴,那麼如何區別呢?

舉個常用的例子:

Abstract Class Sharp implement IHaveSide {
public bool isSharp(){
return true;
}
public abstract int getSides();
}

Class Triangle extends Sharp {
public override int getSides() {
return 3;
}
}

Class Rectangle extends Sharp {
pubilc override int getSides() {
return 4;
}
}

那麼這種類的關系叫做繼承,下面這種使用方式也是繼承所帶來的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());

而這種方式則是多態:
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");

這兩者區別在哪?很顯然,繼承是子類使用父類的方法,而多態則是父類使用子類的方法。

其技術上的區別是綁定時期,晚期綁定一定是多態。...余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved