看板 PHP 關於我們 聯絡資訊
※ 引述《ajeams (PHP新手)》之銘言: : 各位版大好 小弟是PHP的初心者 : 對於物件導向方面還在學習中 : 想請問一下 : abstract class (抽象物件) 與 interface : 這兩個的作用是? : 以及使用這兩個的時機是? : 如果可以的話 麻煩請解釋清楚一點 因為小弟去看了一篇文章後 : ( http://blog.roodo.com/jaceju/archives/3996905.html ) : 還是有看沒有懂 (資質駑鈍請見諒) 拜託大家了 感恩!!! 首先 abstract classes 應該翻譯成『抽象類別』;所謂『物件』是指『已 經實體化的類別(佔有記憶體空間)』而抽象類別無法實體化。 x x x abstract class 宣告了一個抽象類別,由於抽象類別無法實體化,所以需 透過繼承它的子類別(subclasses)才能實現其定義。 interface 則定義了一個/一組函式。同樣的,介面本身無法實體化;它需要 在實作(implement)它的類別中詳細的描述實作的細節。 一個抽象類別與其子類別間,在邏輯上關係是緊密相關的,舉個例子: 方形(Square)、圓形(Circle)、三角形(Triangle)都是一種形狀(Shape) 但是它們之間表現型態卻有不少差異。在這種情況中,一般會將 Shape 設計 成一個抽象類別,讓方形、圓形、三角形等繼承此抽象類別。 介面與『實作的類別』間則未必有前述那般緊密的相關;它們的相關多半是 『功能性的相關』如果你要一個或一組函式能在不同的類別中被呼叫那麼可 以將這組函式定義在介面中、以便讓不同類別實作。 延伸之前的例子,假設現在多了一種 Line 的形態,而所有的 Line 都跟 Shape 一樣可以繪製自己,那麼便可設計一個 Draw 介面去做這件事情。介面可以看做 是一種實作的保證契約,因為類別一經宣告要實作某介面時便有責任依約行事。 實務上的情況是:如果沒有定義介面,在多人撰寫不同的類別的情況下,若是 Shape 和 Line 都需有繪製的方法,難保不會一組人寫成 drawShape()、另一 組人寫成 drawLine(),造成呼叫前還得先判別是那種類別的物件,這一來便 大大降低了物件多型(polymorphism)的好處。 為了避免那樣的情況,我們可以定義共同的介面:Draw,並要求有繪製功能的 類別都要實作此介面,因而我們甭管 $obj 是什麼類別,皆能以 $obj->draw() 呼叫繪製功能。 抽象類別和介面的差異主要是設計層次上的問題,倒不是語言的特定問題,如果 還有疑問,其實可以去翻翻其他物件導向語言、或是設計/分析方法的書。 另外補充一點,因為一個類別能實作多個介面、卻只能繼承自一個父類別,所以 有些時候介面被當做彌補多重繼承的工具。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.175.177.114 ※ 編輯: foxzgerald 來自: 218.175.177.114 (10/18 19:00)
ajeams :感謝大大釋疑 不好意思 再請教一點 10/18 19:32
ajeams :project屬個人單人製作的話 需要interface嗎?? 10/18 19:33
ajeams :還是大大會建議養成這種習慣 這樣才會學好OO呢?? 10/18 19:34
ajeams :ps.目前是寫一個小型的網站(之後想續擴充功能) 10/18 19:36
※ 編輯: foxzgerald 來自: 218.175.177.114 (10/18 21:24)