在物件導向程式設計,多型性是乙個強大的和基本的工具。它可以用來在您的應用程式建立乙個更有機的流。本教程將介紹多型性的籠統的概念,以及它如何在php中可以很容易地部署。
什麼是多型性?
polymorphism(多型性)是乙個很長的單詞,但是它表示的是乙個非常簡單的概念。
多型性描述了在物件導向程式設計模式中類有不同的功能,而共享乙個通用的介面。
多型性的優點是,並不需要知道它使用的是哪乙個類,因為他們都用同樣的方式與不同的類的**工作。
可將多型性模擬成現實世界的乙個按鈕。大家都知道如何使用乙個按鈕:您只需給它施加壓力。乙個按鈕「確實是這樣」,然而,取決於它和什麼連線和使用它的上下文 - 但結果並不影響它是如何使用。如果你的老闆告訴你按下乙個按鈕,您已經有執行任務所需的所有資訊。
在程式設計的世界中,多型性是用來使應用程式更加模組化和可擴充套件的。相比於凌亂的條件語句描述的行動不同的課程,您可以建立根據您的需求選擇的互換物件。這是多型性的基本目標。
inte***ces介面
介面是與類(class)類似的,除了它不能包含**。介面可以定義方法名稱和引數,但不是方法的內容。實現介面的任何類都必須實現介面中定義的所有方法。乙個類可以實現多個介面。
使用的「inte***ce」關鍵字宣告乙個介面:
inte***ce myinte***ce被附加到乙個類,使用「implements」關鍵字(多個介面,可以通過用逗號分開):
class myclass implements myinte***ce在介面中可以像在類中一樣定義方法,除了沒有方法體(在大括號中的部分)以外。
inte***ce myinte***ce在這裡定義的所有方法都必須如介面中所描述地那樣被包含在任何實現它的類中。(讀下面的**注釋)
//合法的 valid抽象類abstract classclass myclass implements myinte***ce
public function dothat()
public function setname($name)
}// 非法的invalid
class myclass implements myinte***ce
public function setname()
}
抽象類是介面和類的混合。它可以像介面一樣定義方法。繼承自抽象類的類必須實現抽象類中定義的所有抽象方法。
抽象類的定義方式與類一樣,不過是在前面附加了乙個abstract 關鍵字。
abstract class myabstract並且 是用 『extends『 關鍵字附加到類:
class myclass extends myabstract就像在普通類中一樣,普通的方法以及任何抽象方法(使用關鍵字「abstract」)可以在抽象類中定義。抽象方法的行為就像在介面中定義的的方法,而且繼承它的擴充套件類中必須實現完全一樣的定義。
abstract class myabstractabstract public function dothat();
abstract public function setname($name);
}
就像下面這樣:
class poly_base_article注意:在這個教程中的示例類使用了「package_component_class」的命名約定,這是乙個用來將類名分隔到虛擬的命名空間來避免命名衝突的通用方法。}
現在你想新增乙個方法來輸出各種不同格式的資訊,如xml和json。你也許會打算像下面這樣做:
class poly_base_article它就是那樣簡單,我們已經定義了乙個公用方法write() ,它接受乙個文章物件作為引數。任何實現writer介面的類都將會確保有這個方法。return $ret;
}} 但是現在你只是在稀釋(fix me: diluting) 你的類。
oop的乙個重要原則是乙個類應該做的一件事情,而應該把它做好。考慮到這一點,條件語句應該是乙個紅色的標誌,表明你的類是試圖做太多不同的東西。這是多型性的用武之地。第一件事就是我們應該定義介面,努力想好怎麼定義你的介面是件重要的事情,因為對它的任何改變都將需要改動呼叫它的**。
在我們這個例子中,我們將使用乙個簡單的介面來定義乙個方法:
inte***ce poly_writer_writer
據。不幸的是,在目前版本的php中,返回型別提示是不被支援的,所以,你要小心返回值的型別了。
定義介面後,該是時候來建立類來真正幹活的啦。在我們的例子中,我們需要輸出兩種格式。這樣,我們就要兩個writer 類:xmlwriter 和 jsonwriter 。從傳遞過來的
article 物件提取資料然後格式化這些資訊完全取決於這些類了。
下面是 xmlwriter 類的乙個示例:
class poly_writer_xmlwriter implements poly_writer_writer就如你可以從類定義中看到的一樣,我們使用implements關鍵字來實現我們的介面。write() 方法包含格式化為xml的功能。}
現在我們來看下jsonwriter 類:
class poly_writer_jsonwriter implements poly_writer_writer現在,我們的**中的特定每種格式都包含在單獨的類。每個類有全權負責處理特定的格式,而不是其他。您的應用程式中沒有其他部分需要關心這些是如何工作的才能使用它,}
感謝我們的介面。
在我們的新類定義後,該是時候來重溫一下我們的article類了,所有原write() 方法中的**已經被分離出來,進入到我們的新類中了。
我們的所有方法現在需要做的就是使用這些新的類,像這樣:
class poly_base_article獲取乙個 writer物件 obtaining a writer}
你也許會疑惑你該從**獲取乙個 writer物件開始,因為你需要傳遞乙個 writer物件到這個方法。
這完全取決於你,並且,有很多策略。如,你可能會使用工廠類來獲取請求資料然後建立乙個物件:
class poly_base_factory就像我說的,根據你的需求,有好多其它策略可用。在這個例子中,通過乙個請求變數選擇哪種格式是要使用的。它基於request請求變數來構造乙個類名,檢測它是否存在,// otherwise we fail
throw new exception('unsupported format');
}}
然後返回乙個新的writer物件。如果沒有那個名字的類存在,丟擲乙個異常,讓客戶端**決定接下來要幹什麼。
當所有東東都到位了,下面是我們的客戶端**如何放在一起:
$article = new poly_base_article('polymorphism', 'steve', time(), 0);首先,我們建立了乙個示例 article 物件來配合工作。然後,我們試圖從工廠factory獲取乙個factory物件,如果異常發生的話回滾到預設(xmlwriter) 。try
catch (exception $e)
echo $article->write($writer);
最後,我們傳遞writer物件給我們的article的 write() 方法,輸出結果。
在本教程中,我提供了乙個多型性的簡介而且解釋了php中的介面。我希望你意識到,我只向您展示乙個潛在的使用多型性的案例。
譯自:原文發表在:
hacklog【荒野無燈weblog】
python中多型和多型性的理解
多型怎麼理解?一類事物,有多種形態,比如動物類,可以有貓 狗 雞。乙個抽象類有許多子類 class animal object deftalk self pass class cat animal 動物的形態一 貓 deftalk self print 這是貓 class dog animal 動物...
C 多型性的理解
根據清華大學鄭莉老師的書 c 語言程式設計 來總結 1 多型 是指類中具有相似功能的不同函式,使用同乙個名稱來實現 是對類的行為再抽象 多型是通過過載函式和虛函式來實現的。2 繼承討論的是類與類的層次關係,多型則是考慮在不同層次的類中,以及在同乙個類的內部,同名成員函式之間的關係問題,是解決功能和行...
C 多型性的理解和舉例
多型性是物件導向程式的乙個重要特徵,下面通過程式來理解程式的多型性 多型性 includeusing namespace std class point float gety const friend ostream operator ostream const point protected fl...