【问题标题】:Interface extends another interface but implements its methods接口扩展了另一个接口,但实现了它的方法
【发布时间】:2012-04-30 22:16:39
【问题描述】:

在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中实现的方法外还有实现标志。

当我将鼠标悬停时,它说它实现了该方法!!!

【问题讨论】:

  • 当你扩展一个接口时,你只能添加它,这就是你这样做的原因。接口不实现方法。

标签: java interface extends implements


【解决方案1】:

ad 1. 它没有实现它的方法。

ad 4. 一个界面扩展而不是实现另一个界面的目的是构建一个更具体的界面。例如,SortedMap 是扩展 Map 的接口。对排序方面不感兴趣的客户端可以针对Map 进行编码并处理例如实现SortedMapTreeMap 的所有实例。同时,另一个对排序方面感兴趣的客户端可以通过SortedMap 接口使用这些相同的实例。

在您的示例中,您正在重复超级接口中的方法。虽然合法,但它是不必要的,并且不会改变任何最终结果。无论这些方法是否存在,编译后的代码都将完全相同。无论 Eclipse 的悬停说什么,都与 接口没有实现任何东西这一基本事实无关。

【讨论】:

    【解决方案2】:

    接口定义行为。例如,Vehicle 接口可能会定义 move() 方法。

    汽车是车辆,但具有其他行为。例如,Car 接口可能定义了startEngine() 方法。由于 Car 也是 Vehicle,Car 接口扩展了Vehicle 接口,因此定义了两个方法:move()(继承)和startEngine()

    Car 接口没有任何方法实现。如果您创建一个实现 Car 的类(Volkswagen),它必须为其接口的所有方法提供实现:move()startEngine()

    一个接口不能实现任何其他接口。它只能扩展它。

    【讨论】:

    • 我已经回答了他们。前 3 个问题没有意义,因为一个接口不实现另一个接口,也不包含任何方法实现。我的回答回答了第四个问题:它允许提供额外的行为/方法。
    • 我将其描述为 Eclipse 的一个小错误。在 DragController 接口中重新声明方法是没有意义的,除非你想提供额外的 javadoc。
    【解决方案3】:

    为什么要实现它的方法?它如何实现它的方法 当接口不能包含方法体时?它如何实现 当它扩展另一个接口而不实现它时的方法?什么 一个接口实现另一个接口的目的是什么?

    接口不实现另一个接口的方法,只是扩展它们。 需要接口扩展的一个例子是:考虑你有一个带有moveForwardmoveBack两种方法的车辆接口,但你还需要合并作为车辆但有一些附加方法的飞机,如moveUp,@ 987654324@所以 最后你有:

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

    和飞机:

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

    【讨论】:

    • 所以,您基本上是将方法累积到一个名为IAirplane 的地方,而您实际上并没有继承。还有一点,我想请IVehicle的作者理解,为什么这个接口Ivehicle没有设计成已经考虑moveDown()moveBack(),因为interface是从现有的一组具体类中发现的(我我假设飞机概念是他这一代人的一部分)。总的来说,我觉得扩展接口是现有糟糕设计的结果,因为我们在这种情况下打破了extends 的目的。
    • @overexchange 在这种情况下没有接口是在类之前设计的。接口描述了一个功能,但是这些类代表了现实世界的对象。这是类和交互之间的主要区别。没有关于 moveUp moveDown 等。任何车辆都可以前后移动,但并非所有车辆都可以上下移动。飞机可以前后移动,也可以上下移动,但不同类型的飞机会以不同的方式进行。
    • 你说的我没听懂:interface in this case is designed before the classes. 在任何软件设计的任何情况下,接口都是在设计具体类之后才发现的。
    • "在任何软件设计的任何情况下,接口都是在设计具体类之后发现的。"不是真的。 C++ 中的示例 COM。为了实现一个新类,你必须实现一个已经存在的接口。 Java 也是如此。使用任何 OO 库并尝试对其进行扩展,您将首先拥有接口...
    • Overexchange,你是说IVehicle 接口应该有所有可以想象的方法(即向上/向下/向后/向前移动)作为具有IAirplane 接口来处理这些情况的更可取的设计?汽车的具体实现是否会让这些方法无法实现?
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2021-11-19
    • 2020-06-03
    • 2010-10-21
    • 2021-11-01
    • 2020-11-22
    相关资源
    最近更新 更多