2012-05-23 45 views
1

我正在學習抽象類和接口之間的區別, 但理論上的解釋在您沒有實際示例時很難理解。 我已閱讀: 通過更新基類,所有繼承類都會隨更改而自動更新。另一方面,接口一旦創建就無法更改。如果需要新版本的界面,則必須創建一個全新的界面。 如果有人能給我提供一個這樣的例子,我會非常感謝, 祝你有愉快的一週。PHP,OOP實用示例

+2

此問題已被多次詢問和討論(http://stackoverflow.com/search?q=Class+vs.+Interface)。 –

回答

2

考慮這個例子。我們有一個可驅動的界面,汽車摘要和一個使用兩者的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方法。

+1

非常感謝,這真是我很好的解釋,現在謝謝大家,祝你有個愉快的一週。 – Blanktext

+0

@mike這很棒。這解決了我腦海中混亂的頭腦。很好的例子 – inckka

1

接口可以改變,你只需要實現繼承類的所有變化。例如,您正在製作一個SpaceShip接口,並且您有CoolEnemyShip,StupidEnemyShip,PlayerShip,並且您已經向SpaceShip添加了一個新功能來添加一些新功能,如Boost()函數,您必須在3實現中實現Boost類(CoolEnemyShip,StupidEnemyShip,PlayerShip)

另一方面,如果SpaceShip是一個基類,並且你實現了Boost()函數,那麼所有的繼承類都可以使用Boost()函數。這是主要區別,你不應該需要一行代碼來理解它,只是類比應該可以幫到你。

+0

首先謝謝你,你的解釋是非常好的,我會想象這個解釋真的很棒,但我不明白界面和抽象類之間的區別,如果你能寫出與你的解釋相協調的代碼,我認爲它會有幫助我明白了,再次感謝你。抽象類: – Blanktext

+0

:可以實現的方法。界面:剛纔有什麼方法可以實施 – Mustafa

1

抽象基類用於創建擴展類將繼承的功能。

接口用於定義必須由使用此接口的類實現的一組嚴格的函數。

有一點重疊,抽象類可以將方法標記爲抽象,將實現留給繼承類。

+0

所以如果我理解你的解釋,當我們使用抽象類時,繼承我們抽象類的類重寫我們的Bodiless抽象類方法或繼續他們而忽略方法的名稱 – Blanktext