前言今天查看本科生c++試卷的時候,發現還是有同學學習過c++之後,卻對物件導向的3大特性都不瞭解,這裡用php解釋一下介面和多態性,也當作是一種自我學習吧介面PHP類是單繼承,也就是不支援多繼承,當一個類需要多個類的功能時,繼承就無能為力了,為此PHP引入了介面技術如果一個抽象類別裡面的所有方法都是抽象方法,且沒有聲明變數,而且介面裡面所有的成員都是public許可權的,那麼這種特殊的抽象類別就叫介面介面使用interface關鍵字定義,並使用implements來實現介面的方法,且必須完全實現抽象類別和介面的區別介面是一個特殊的抽象類別,也可以看作是一個模型的規範。介面與抽象類別大致區別如下:
- 一個子類如果implements一個介面,就必須實現介面中的所有方法(不管是否需要);如果繼承一個抽象類別,只需要實現需要的方法即可
- 如果一個介面中定義的方法名改變了,那麼所有實現此介面的子類需要同步更新方法名;而抽象類別中如果方法名改變了,其子類對應的方法名將不受影響,只是變成了一個新的方法而已
- 抽象類別只能單繼承,當一個子類需要實現的功能需要繼承多個父類時,就必須使用介面
程式碼範例
<?php/** * 聲明介面Demo * @author wzy * */interface Demo{ const NAME = "wangzhengyi"; const AGE = 25; function fun1 (); // 聲明方法預設是public abstract function fun2 ();}/** * 聲明介面的繼承Demo2 * * @author wzy * */interface Demo2 extends Demo{ function fun3 (); function fun4 ();}/** * 聲明介面Demo3 * * @author wzy * */interface Demo3{ function fun5 (); function fun6 ();}/** * 聲明父類ParentClass * * @author wzy * */class ParentClass{ function fun7 ();}/** * 子類必須實現介面中所有的方法 * * @author wzy * */class ChildClass extends ParentClass implements Demo2, Demo3{ function fun1 (); function fun2 (); function fun3 (); function fun4 (); function fun5 (); function fun6 ();}多態性多態性是物件導向設計的重要特性,它展現了動態綁定(dynamic binding)的功能,也成為“同名異式”。多態的功能可以讓軟體在開發和維護時,達到充分的延伸性(extension)通俗理解多態最直接的定義就是讓具有繼承關係的不同類對象,可以對相同名稱的成員函數調用,產生不同的反應結果多態的代碼
<?php/** * 聲明介面Demo * @author wzy * */interface Demo{ const NAME = "wangzhengyi"; const AGE = 25; function fun1 (); // 聲明方法預設是public abstract function fun2 ();}class One implements Demo{ public function fun1 () { echo Demo::NAME . "就讀於中國傳媒大學"; } public function fun2 () { echo Demo::NAME . "的年齡是" . Demo::AGE; }}class Two implements Demo{ public function fun1 () { echo Demo::NAME . "在北京靈創眾和科技有限公司實習中"; } public function fun2 () { echo Demo::NAME . "去年的年齡是24"; }}// 同一個介面,實現同一個方法,不同的對象,反應結果不同。這就是多態的表現和應用$one = new One();$one->fun1(); // wangzhengyi就讀於中國傳媒大學$one->fun2(); // wangzhengyi的年齡是25echo "<br>";$two = new Two();$two->fun1(); // wangzhengyi在北京靈創眾和科技有限公司實習中$two->fun2(); // wangzhengyi去年的年齡是24