我正在學習抽象類和接口之間的區別, 但理論上的解釋在您沒有實際示例時很難理解。 我已閱讀: 通過更新基類,所有繼承類都會隨更改而自動更新。另一方面,接口一旦創建就無法更改。如果需要新版本的界面,則必須創建一個全新的界面。 如果有人能給我提供一個這樣的例子,我會非常感謝, 祝你有愉快的一週。PHP,OOP實用示例
回答
考慮這個例子。我們有一個可驅動的界面,汽車摘要和一個使用兩者的Pinto類。
interface Drivable
{
public function go();
}
abstract class Automobile
{
public $type;
public function getType() {
return $this->type;
}
}
class Pinto
extends Automobile
implements Drivable
{
public function go() {
// code to make it go
}
}
通過在Automobile
中定義它們,我們可以輕鬆地爲所有汽車添加方法。在那裏添加的任何新方法都可用於所有擴展類。
但是,如果我們向Drivable接口添加方法,則必須在每個實現它的類中尋找並實現所述方法,以添加新方法,否則將無法編譯。
例如,假設我們在接口中添加了stop()
方法。 Pinto
將立即引發錯誤,因爲它沒有stop
方法。
接口可以改變,你只需要實現繼承類的所有變化。例如,您正在製作一個SpaceShip接口,並且您有CoolEnemyShip,StupidEnemyShip,PlayerShip,並且您已經向SpaceShip添加了一個新功能來添加一些新功能,如Boost()函數,您必須在3實現中實現Boost類(CoolEnemyShip,StupidEnemyShip,PlayerShip)
另一方面,如果SpaceShip是一個基類,並且你實現了Boost()函數,那麼所有的繼承類都可以使用Boost()函數。這是主要區別,你不應該需要一行代碼來理解它,只是類比應該可以幫到你。
抽象基類用於創建擴展類將繼承的功能。
接口用於定義必須由使用此接口的類實現的一組嚴格的函數。
有一點重疊,抽象類可以將方法標記爲抽象,將實現留給繼承類。
所以如果我理解你的解釋,當我們使用抽象類時,繼承我們抽象類的類重寫我們的Bodiless抽象類方法或繼續他們而忽略方法的名稱 – Blanktext
- 1. PHP:真實世界的OOP示例
- 2. PHP Memcached擴展OOP實例
- 3. OOP真實世界示例
- 4. 使用PHP實現數據庫連接的OOP示例
- 5. Python OOP示例?
- 6. PHP中的實例化類OOP
- 7. OOP實例更新
- 8. oop實例化pythonic實踐
- 9. PHP的高級OOP功能的真實世界示例
- 10. OOP類別和實例
- 11. OOP刪除類實例
- 12. Python OOP對象實例化
- 13. OOP - 對象和實例
- 14. 這些PHP OOP示例中的哪一個是PHP OOP結構的「常見」實踐?
- 15. PHP OOP問題,舉例
- 16. OOP PHP:在創建實例後調用類作爲函數
- 17. 使用案例方法的PHP OOP
- 18. PHP OOP在實例中保存對象的實例還是隻保存ID?
- 19. 您可以在PHP中提供真實世界的OOP示例嗎?
- 20. PHP實體類示例
- 21. PHP OOP - 將對象的實例獲取到另一個類
- 22. PHP OOP性能:參數或實例變量?
- 23. OOP的問題,實例化對象
- 24. OOP的Javascript,獲得實例名
- 25. Python的OOP,不能覆蓋實例
- 26. 需要一個OOP Cobol的實例嗎?
- 27. PHP OOP:接口與非接口方法 - 示例
- 28. Android中OOP概念的示例
- 29. OOP - CRUD或使用案例?
- 30. 如果對象沒有實例,調用靜態函數返回NULL? PHP OOP
此問題已被多次詢問和討論(http://stackoverflow.com/search?q=Class+vs.+Interface)。 –