2012-04-19 115 views
37

在java中:接口擴展另一個接口,但是當一個接口擴展另一個接口實現它的方法

  1. 爲什麼它實現它的方法?
  2. 它如何實現它的方法,當一個接口不能包含 方法體
  3. 它如何實現的方法時,它擴展了其他接口 並沒有實現呢?
  4. 接口實現另一個接口的目的是什麼?

這具有重大的概念,Java的!

編輯:

public interface FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 
} 


public interface DragController extends FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 

    void dragEnd(); 

    void dragMove(); 
} 

在Eclipse中有除了在DragController實現的方法實現的跡象。

而當我鼠標懸停它,它說,它實現了該方法!

+3

當你擴展接口,你可以只添加到它,這就是爲什麼你做到這一點。接口不實現方法。 – 2012-04-19 12:17:50

+4

我沒有得到downvote。 。 。 – GingerHead 2014-05-01 13:43:36

回答

45

它爲什麼實現它的方法?當一個接口不能包含方法體時,它如何實現它的方法 ?當它擴展其他接口並且不實現它時,它如何實現 方法?什麼 是實現另一個接口的接口的目的?

接口不實現另一個接口的方法,但只是擴展它們。 一個例子在需要的接口擴展爲:認爲你有兩種方法moveForwardmoveBack車輛界面,但你也需要把該飛機是車輛,但一些另外的方法,如moveUpmoveDown所以 到底您有:

public interface IVehicle { 
    bool moveForward(int x); 
    bool moveBack(int x); 
}; 

和飛機:

public interface IAirplane extends IVehicle { 
    bool moveDown(int x); 
    bool moveUp(int x); 
}; 
+0

所以,你基本上將方法積累到一個名爲'IAirplane'的地方,而你實際上並不是繼承。另一點是,我會問'IVehicle'的作者理解爲什麼這個接口'Ivehicle'沒有被設計爲已經考慮'moveDown()'和'moveBack()',因爲'interface'是從現有的具體的課程(我假設飛機概念是他的一代的一部分)。總的來說,我認爲,擴展接口是現有糟糕設計的結果,因爲我們在這種情況下打破了'extends'的目的。 – overexchange 2014-12-10 06:59:42

+0

@proxchange在這種情況下無界面是在類之前設計的。界面描述了一個功能,但是這些類代表了真實世界的對象。這是類和交互的主要區別。沒有關於moveUp moveDown等。任何車輛都可以前後移動,但不是所有車輛都可以上下移動。飛機可以前後移動,也可以上下移動,但不同類型的飛機會以不同的方式進行操作。 – AlexTheo 2014-12-11 21:55:38

+0

當你說:'在這種情況下,接口是在類之前設計的。「在任何軟件設計的任何情況下,接口都是在設計具體類之後發現的。 – overexchange 2014-12-12 00:49:53

6

ad 1.它沒有實現它的方法。

ad 4.一個接口的延伸目的是,而不是實現另一個,是建立一個更具體的接口。例如,SortedMap是延伸Map的接口。對排序方面不感興趣的客戶端可以編碼Map並處理例如TreeMap的所有實例,其實施SortedMap。同時,對排序方面感興趣的另一個客戶端可以通過SortedMap接口使用那些相同的實例。

在您的示例中,您正在從超級界面中重複這些方法。雖然合法,但沒有必要,也不會改變最終結果。編譯後的代碼將與完全相同這些方法是否存在或不存在。無論Eclipse的懸停說什麼是基本的事實接口沒有實現任何東西無關。

18

接口定義行爲。例如,一個Vehicle接口可能會定義move()方法。

汽車是汽車,但有其他行爲。例如,Car接口可能會定義startEngine()方法。由於汽車也是一個車輛中,Car接口擴展了Vehicle接口,並且因此定義了兩種方法:move()(繼承)和startEngine()

Car接口沒有任何方法實現。如果您創建了實現Car的類(Volkswagen),則必須爲其接口的所有方法提供實現:move()startEngine()

接口可能不會實現任何其他接口。它只能擴展它。

+2

我已經回答了他們。 3個第一個問題沒有意義,因爲接口沒有實現另一個接口,也沒有包含任何方法實現。第四個答案是我的答案:它允許提供額外的行爲/方法。 – 2012-04-19 12:34:43

+2

我會將它描述爲Eclipse的一個小錯誤。在DragController接口中重新聲明方法沒有意義,除非您想提供額外的javadoc。 – 2012-04-19 13:01:48