/*
--------------------------------------------- ----------------------------------
| = 本文為Haohappy讀>
| = 中Classes and Objects一章的筆記
| = 翻譯為主要在Classes and Objects一章中的筆記
| = 翻譯為主個人心得
| = 為避免可能發生的不必要的麻煩 》批評、謝謝,希望與所有PHP愛好者共同進步!
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
----------------- -------------------------------------------------- ------------
*/
第十節--抽象方法和抽象類別
物件導向程式透過類別的分層結構建構起來. 在單重繼承語言如PHP中, 類別的繼承是樹狀的. 一個根類別有一個或更多的子類別,再從每個子類別繼承出一個或更多下一級子類別. 當然,可能存在多個根類別,用來實現不同的功能. 在一個良好設計的體系中,每個根類都應該有一個有用的接口, 可以被應用代碼所使用. 如果我們的應用代碼被設計成與根類一起工作,那麼它也可以和任何一個從根類別繼承出來的子類別合作.
抽象方法是就像子類別中一般的方法的佔位符(佔個地方但不起作用),它與一般方法不同—沒有任何程式碼. 如果類別中存在一個或更多抽象方法, 那麼這個類別就成了抽象類別. 你不能實例化抽象類別. 你必須繼承它們,然後實例化子類別. 你也可以把抽象類別看成是子類別的一個範本.
如果你覆寫所有的抽象方法, 子類別就變成一個普通的類別. 如果沒有覆寫所有方法, 子類別仍是抽象的. 如果一個類別中包含有抽象方法(哪怕只有一個), 你必須聲明這個類別是抽象的, 在class關鍵字前加上abstract.
聲明抽象方法的語法與聲明一般方法不同. 抽象方法的沒有像一般方法那樣包含在大括號{}中的主體部份,並用分號;來結束.
在例子6.13中, 我們定義了一個含有getArea方法的類Shape. 但由於不知道形狀不可能確定圖形的面積,確良我們宣告了getArea方法為抽象方法. 你不能實例化一個Shape物件,但你可以繼承它或在一個表達式中使用它, 就像例6.13中那樣.
如果你建立了一個只有抽象方法的類,你就定義了一個介面(interface). 為了說明這種情況, PHP中有interface 和implements關鍵字. 你可以用interface來代替抽象類別, 用implements來代替extends來說明你的類別定義或使用一個介面. 例如, 你可以寫一個myClass implements myIterface. 這兩種方法可以依個人偏好來選擇.
/*註:
兩種方法即指:
1. abstract class aaa{} aaa中只有抽象方法,沒有一般方法)
class bbb extends aaa{} (在bbb中覆寫aaa中的抽象方法)
2. interface aaa{}
class b aaalements aaa在bbb中覆寫aaa中的抽象方法)
*/
Listing 6.13 Abstract classes