2012-02-14 74 views
3

因此,我開始喘氣的概念摘要接口在PHP中。
但是它什麼時候真的有用?什麼時候使用擴展/抽象和實現/在PHP接口

相信我能與接口彌補規則爲我的課,所以他們都遵循一個特定的模式。 但是它什麼時候真的有用?

爲什麼我應該做一個摘要類,而不是讓它自己工作的類,但對其他類很有用。
摘要我也許可以把我的頭,看到一個良好的使用,例如通過一個普通的類。像製作一個抽象的數據庫類,然後將其擴展到一個Mysql和一個MsAccess數據庫類。提供兩種類似的功能,以便在這兩種情況下實現無縫體驗。

但實際上,任何人都可以給我當抽象接口真正有用的一個更好的例子嗎?
請注意,我知道它是如何工作的,或者如何編寫代碼,而不是如何或何時使用它。

謝謝!

+0

http://stackoverflow.com/search?q=abstract+vs+interface – Gordon 2012-02-14 10:01:25

+0

可能的副本哦,來吧夥計。這是不是重複的可能性?你爲什麼回答它? – Gordon 2012-02-14 10:04:13

+1

[Interface vs Abstract Class(general OO)]可能的重複](http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo) – hakre 2012-02-14 10:05:54

回答

6

一個接口不是一個類,而一個抽象類已經是一個類。

由於每個班級都有一個接口(根據定義),interface允許您指定一個接口下一個任何類,無論是否抽象。

對接口進行編程,然後允許您用另一個替換一個類保持相同的接口。所以它使你的代碼更少耦合。它不再針對具體類進行編程,而是僅針對更輕量級的接口。如果您不想針對具體的類名稱而針對類型進行編程,那麼接口是非常有用的。您可以將對象替換爲實現相同接口的任何其他對象。

另一方面,抽象類 - 甚至稱爲抽象 - 非常具體。然而,它並不是最終的,所以它形成了一個類的模式,就像一個規範一樣,從它延伸出來的類應該如何爲某個功能編寫。因爲它是抽象的,它不能從沒有延伸的地方過日子。抽象類用於創建具有代碼的基類,這些代碼將被多次使用以減少代碼重複並且不能直接實例化。

+0

所以,一個接口只是一種讓程序員從忘記模式?所以說,這是對如何編碼或對未來編碼者的指導,這些編碼者顯然不會與第一個編碼器共享相同的內存(如果我們未來不會創造更好的人類記憶共享,也就是說話,方法)^^ – jamietelin 2012-02-14 10:35:46

+0

至少你可以使用這種接口:)我不會稱之爲「遺忘」,但只是爲了讓它定義,接口是指定的。當然,這對團隊合作很有幫助,但也可以隨着時間的推移對具體類進行更改,因爲它不是針對某個類而是僅針對界面編碼的。該類可以更改或可以交換(測試,應用程序增長)。一些編碼人員認爲,在編寫課程之前總是要有一個接口,但從我知道的情況來看,這有時是多餘的,因爲不是必需的。只是說。 – hakre 2012-02-14 11:45:29

7

摘要的意思是「這裏是你的班級的模式,有些代碼可以啓動你」。抽象類的設計者可以將某些方法標記爲需要由擴展類(abstract)或final提供,這意味着該類不能覆蓋它們。

界面意思是「這裏是你的班級模式,但你必須自己寫所有的代碼」。接口中聲明的任何方法和屬性都必須由實現接口的類提供。

所以基本上一個經驗法則是:

如果你有一個可以或必須由子類中使用的代碼,你需要一個抽象類。如果你只有方法和屬性聲明,你可以使用一個接口。

別忘了,使用抽象類限制到了一定程度,因爲一個派生類只能擴展一個類,而它可以實現任意數量的接口。

2

一個接口就像合同一樣工作。如果一個類實現了一個接口,那麼使用這個類的其他代碼現在知道它支持某些特性。

PHP中接口的最佳示例是Iterator接口。

接口的好處是類可以實現多個接口。 '擴展'不允許這樣做。這意味着一個子類可以實現一個接口,但是父類不需要。

閱讀設計模式。你會發現很多這方面的內容,你再也不會懷疑在哪些情況下它是有意義的。 「首先設計模式」我認爲是一本很好的書,非常好寫。儘管他們在示例中使用了Java,但大多數內容在PHP中都非常適用。

我還有一個現實生活場景。

我們的應用總是每當發生錯誤時都會拋出異常。每種類型的異常都會得到它的自定義類。一個例子是RecordNotFound異常。

如果異常沒有被抓,有一個頂級異常塊,這看起來有點像這樣:

try { 

// Do everything in the app! 

} catch (Exception $e) { 

    // draw a good error page 

} 

在某些情況下例外需要映射到特定的HTTP狀態代碼,如404(未找到)。因此,我們有這樣的接口:

interface HTTPException { 

    function getHTTPCode(); 

} 

任何例外,無論多麼深的繼承樹現在可以實現此接口併發出特定的HTTP狀態代碼。

我甚至創建了接口,沒有任何方法。我會留給你,試圖想出爲什麼這可能有道理的原因。

+0

標記界面模式?那麼,將類似的類分組? – jamietelin 2012-02-14 10:37:09

2

接口不過是一個類的骨架結構,它不是類。我們可以實現該類並添加一些額外的功能以使其更清晰。 實現關鍵字可用於接口。一般方式實現用於接口來實現功能。

摘要是一類隱藏了一些功能,只顯示必要的功能。 延伸關鍵字可用於提要類。通常,可以使用擴展來擴展抽象類的特徵。

相關問題