抽象類也是面向對象中的重要概念,和接口、繼承的概念重要性相當,在面向對象的開發中,所有的對象都是通過類來描述的,但是反過來,並不是所有類都是用來描繪對象的,廣義上講如果一個類中沒有足夠信息來描述一個具體的對象,這樣的類就是抽象類。具體用簡單的代碼來實現:
1 abstract class ACanEat { 2 // 抽象方法需要在子類中實現 3 abstract public function eat($food); 4 5 public function breath(){ 6 echo "Breath use the air.<br />"; 7 } 8 } 9 10 // Human類繼承了ACanEat抽象類 11 class Human extends ACanEat { 12 // 跟Animal類的實現是不同的 13 public function eat($food){ 14 echo "Human eating " . $food . "\n"; 15 } 16 } 17 18 // Animal類繼承了ACanEat抽象類 19 class Animal extends ACanEat { 20 public function eat($food){ 21 echo "Animal eating " . $food . "\n"; 22 } 23 } 24 25 $man = new Human(); 26 $man->eat("Apple"); 27 $man->breath(); // 和Animal共用了抽象類ACanEat的breath方法 28 $monkey = new Animal(); 29 $monkey->eat("Banana"); 30 $monkey->breath();
從代碼可以簡單的看出,抽象類定義前面以abstract關鍵字開始,里面可以定義多個方法,可以具體實現,也可以定義為抽象方法,沒有實現的方法需要設定為抽象方法,需要在最前面加abstract關鍵字,抽象方法需要在子類中實現,而普通方法子類可以不用重寫,對象可以直接使用。
上面代碼中,Human類和Animal類都繼承了ACanEat抽象類,通過各自不同的方法實現了eat,但是兩個類繼承了相同的方法breath,這個屬性可以認為是相同的,無論實例化哪個對象都可以使用相同的breath方法
所以,抽象類其實就是介於普通類和接口之間的一個類,普通類需要實現所有方法,接口所有方法都不需要實現,而抽象類可以根據自己的需要去選擇實現部分方法;但是一旦類里面有抽象方法,這個類就必須是抽象類,另外注意,抽象類跟接口一樣,不能直接實例化為對象,只能被普通類繼承,,其實抽象類同樣體現了面向對象的多態現象