標籤:
一、抽象方法和抽象類別
在OOP語言中,一個類可以有一個或多個子類,而每個類都有至少一個公有方法做為外部代碼訪問其的介面。而抽象方法就是為了方便繼承而引入的。
抽象方法:當類中有一個方法,他沒有方法體,也就是沒有花括弧,直接分號結束,象這種方法我們叫抽象方法,必須使用關鍵字abstract定義。
例如:public abstract function fun();
抽象類別:包含抽象方法的類必須是抽象類別也要使用關鍵字abstract加以聲明。(即使用關鍵字abstract 修飾的類為抽象類別)
抽象類別的特點:
不能執行個體化,也就new成對象
若想使用抽象類別,就必須定義一個類去繼承這個抽象類別,並定義覆蓋父類的抽象方法(實現抽象方法)。
其實抽象類別對於子類(實作類別),有一個約束的作用。子類繼承一個抽象父類必須實現父類中的所有抽象方法(除非它也是一個抽象類別)
注意:含有抽象方法的類肯定是抽象類別,但是不是所有的抽象類別都必須包含抽象方法。
1 <?php 2 //抽象類別父類A 3 abstract class A 4 { 5 public function fun1() 6 { 7 echo "fun1()...<br/>"; 8 } 9 10 public function fun2() 11 {12 echo "fun2()...<br/>";13 }14 15 public abstract function fun3(); 16 17 /**18 *求和方法19 * @param int $a 被求和參數120 * @param int $b 被求和參數221 * @return int 返回求和結果22 */23 public abstract function add($a,$b); 24 25 }26 27 class B extends A28 {29 public function fun3() 30 {31 echo "fun3()...<br/>";32 }33 34 public function add($x,$y) //這就是約束:函數名必須是add,參數必須有兩個35 {36 return $x+$y;37 }38 }39 40 $b = new B();41 $b->fun1();42 $b->fun2();43 $b->fun3();44 echo $b->add(10,20);45 ?>
二、介面
PHP與大多數物件導向程式設計語言一樣,不支援多重繼承,也就是說每個類只能繼承一個父類。為瞭解決這個這個問題,PHP引入了介面,介面的思想是指定了一個實現了該介面的類必須實現的一系列函數。
介面:如果在一個抽象類別中包含的只有抽象方法,可以將其定義為interface(介面),用implements(實現)關鍵字使用它。
定義格式:
interface 介面名稱
{
//常量成員 (使用const關鍵字定義)
//抽象方法 (不需要使用abstract關鍵字)
}
使用格式: class 類名 implements 介面名1,介面名2{ ... ... }
當一個類在實現了一個介面後,它必須實現即覆蓋該介面的所有方法才可以執行個體化使用,否則即為抽象類別。
1 <?php 2 //介面 3 interface A 4 { 5 public function fun1(); 6 7 public function fun2(); 8 9 public function fun3();10 11 }12 13 //定義了類B實現介面A14 abstract class B implements A15 {16 public function fun1()17 {18 echo "fun1()...<br/>";19 }20 public function fun2()21 {22 echo "fun2()...<br/>";23 }24 25 }26 class C extends B27 {28 public function fun3()29 {30 echo "fun3()...<br/>";31 }32 }33 34 $b = new C();35 $b->fun1();36 $b->fun2();37 $b->fun3();38 ?>
三、抽象類別與介面的區別
定義:
抽象類別表示該類中可能已經有一些方法的具體定義。
介面就僅僅只能定義各個方法的介面,不能有具體的實現代碼在成員方法中。
用法:
抽象類別是子類用來繼承的,當父類已有實際功能的方法時,該方法在子類中可以不必實現。
實現一個介面,必須實現介面中所有定義的方法,不能遺漏任何一個。
理解: 介面就像公司老闆(每年定下一系列目標,不去做,只提出各種計劃)
抽象類別就像公司各層級經理(配合老闆定下的計劃,實現一部分,分發一部分任務員工)
最終繼承的類就是普通員工(接收經理分發的任務,按照要求,毫不遺漏的完成)
四、多態
對象的多態性是指在父類中定義的屬性或行為被子類繼承之後,可以具有不同的資料類型或表現出不同的行為。這使得同一個屬性或行為在父類及其各個子類中具有不同的語義。
為什麼要多態?
多態可以使程式可擴充性更強,減少代碼更改量。
實現多態的方法:繼承(重寫)、抽象、介面。
例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類,其"繪圖"方法功能不同。
1 <?php 2 //多態 3 //主板上的PCI插槽介面 4 abstract class PCI 5 { 6 public abstract function start(); 7 public abstract function stop(); 8 } 9 10 //主板類11 class MainBoard12 {13 public function running(PCI $pci)14 {15 $pci->start();16 $pci->stop();17 }18 }19 20 //音效卡廠家21 class SoundCard extends PCI22 {23 public function start()24 {25 echo "音效卡啟動...<br/>";26 }27 28 public function stop()29 {30 echo "音效卡停止...<br/>";31 }32 }33 34 //網卡廠家35 class NetWorkCard extends PCI36 {37 public function start()38 {39 echo "網卡啟動...<br/>";40 }41 42 public function stop()43 {44 echo "網卡停止...<br/>";45 }46 }47 48 49 //使用:主程式50 $mb = new MainBoard();51 $sc = new SoundCard();52 $nc = new NetworkCard();53 54 $mb->running($sc);55 $mb->running($nc);56 ?>
PHP物件導向(五)