2012-12-08 143 views
0

試圖瞭解一個問題,我在測試了錯誤:擴展對象VS實現接口


如何繼承從實現接口有什麼不同?

  1. 通過繼承,一個類從它的超類獲得行爲。
  2. 通過接口,類可以從它實現的接口獲得行爲。 (這是我選擇的)
  3. 繼承,一個類必須實現由它的超類定義的方法。
  4. 使用接口,類從它實現的接口獲得實例變量和行爲。

我在想的方式是接口定義了行爲,而超類定義了特性...或者它們是相同的嗎?或者我的理解完全倒退了?


編輯:我想我應該指定我做知道接口和繼承之間的區別。我只是想知道使用術語行爲的兩個選項。我不知道這位教授是否在挑剔術語,或者他提出的問題不好。

我知道當你實現一個接口時,你必須實現接口中定義的所有方法。因此,我想說接口定義了一個類必須具有的行爲,但是擴展了另一個超類(儘管它也定義了一些行爲(更多可以給予子類),但它似乎不適合如果這個類實現了一個接口,你可以確定它有某些行爲

也許問題的目的是詢問接口本身是否具有行爲的代碼,或者如果它只是定義 - 如果有這樣的話,我會知道答案

+0

對不起,你的教授是這樣的一個傢伙......他/她正陷入語義學......這裏的訣竅是你的教授如何定義動詞「增益」。 – mre

+0

我會說:1)是的。 (除非你重寫所有內容,並且永遠不要調用'super' - 假設超級構造函數沒有「行爲」)2)編號接口只定義了你需要的方法名稱。 3)否,除非是抽象類。 4)否,接口只定義方法名稱。 – zapl

+0

這是一個真正的竅門嘿嘿。 – OmniOwl

回答

2

我認爲你的一些誤解可能純粹來自語義。描述接口的一種更直接的方式可能是它定義了一個API,但沒有提供該API的實現。需要注意的是,我將使用Java作爲我的示例,但是使用C++之類的語言,實現接口的一種特殊排序繼承 - 即從包含純虛函數的類繼承。

在Java中,例如,你可能有一個事件監聽接口定義爲:

public interface IEventListener { 
    public void handleEvent(Event event); 
} 

,接口不,使用問題的空話,說不談如何實現的IEventListener接口的行爲類當它收到一個事件時,它只能確保任何實現這個接口的類將具有能夠接收Event類型事件的特性。

另一方面,繼承允許超類還繼承行爲(實現)。例如,考慮下面的Java基礎類:

public abstract BaseClass { 
    public void baseMethod(int value) { 
     System.out.println(int); 
} 

public class SubClass extends BaseClass { 
} 

從BaseClass的收益雙方的BaseClass的API(特性),也是實現(行爲)繼承任何類。換句話說,你不但可以調用instanceOfSubClass.baseMethod(1),這樣做會導致BaseClass中定義的行爲,即1被打印到控制檯。

所以你的答案(2)是不正確的,因爲接口不指定行爲(實施)只API(特性)。繼承可以處理兩者。

我認爲問題的關鍵在於解釋當你想共享行爲而不僅僅是API時,繼承特別有用。也就是說,實現(行爲)也可以通過組合來共享,而且這種策略通常更好 - 請參閱Bloch的Effective Java中的第16項,以獲得極好的討論。

+0

'baseMethod()'上沒有關閉括號。 – bcsb1001

2

當你實現一個接口時,你不必太在意實現,還要記住你可以實現與你一樣多的接口w ^螞蟻,因爲他們只是指定合同,但不知道如何去實現它們。界面的創建者可以讓你注意到這一點。

當你擴展一個對象時,通常是因爲你需要一些已經存在的對象已經獲得了大部分的功能,但只需要額外的一點。或者你想重新定義已有對象的某些現有行爲。

給你答案:1是對的。您不必實現超類的方法(繼承)。只有在抽象時,這個超類的下一個子類才需要實現這些方法(就像在一個接口中一樣)。

+0

這並不適用於我的問題。這是一個多選題,我錯了。上面哪個選項是正確的,爲什麼?我假設3和4是正確的。 1是唯一合乎邏輯的其他可能性,但鑑於我的思路,這看起來不對。 – agent154

+0

它確實適用。我會說1是對的。你不必實現一個超類所持有的方法(只有在這個類的下一個子類需要實現這些方法的情況下才是抽象的)。只有使用接口,你必須這樣做。接口只保存方法簽名。 – OmniOwl

0

實現x接口的對象告訴對象必須執行接口定義中列出的所有操作(方法)。因此,在實現x的對象中,您需要實現所有操作。一個接口不能實例化。

但是當你從一個對象y繼承時,對象y可能已經有了一些動作的實現。如果不是,該方法將被標記爲抽象(在Java中),你需要在你的繼承對象中實現它。

0

正確的答案是1,你選擇的答案(選項2)是錯誤的,因爲技術上的接口不有任何行爲。它們只是抽象方法的列表。你可以把它們看作一個模板,你可以在這個模板上建立你的類。例如,假設項目分爲兩部分,最後需要整合。每個團隊都可以使用一個通用界面來建立他們的類,這樣整合將變得更容易。

0

繼承,你得到一隻貓。通過界面,你可以得到一隻貓的骨架。

0

您從繼承中獲得行爲和實現。請記住,子類從它的超類繼承所有非構造函數和私有方法。這意味着你可以繼承某些方法的功能(實現)。

隨着實現,你只是獲得行爲。你正在做的所有事情都是與編譯器簽訂合同,並表示你承諾覆蓋在實現的類或接口中定義的所有抽象方法。

我希望這有助於。