2012-04-19 63 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

相关问题