【问题标题】:Java, Is it possible to inherit interface?Java,是否可以继承接口?
【发布时间】:2012-07-23 08:44:48
【问题描述】:

在我的应用程序中,我有一个类,让我称之为类A。四个类,我称它们为 BCDE 从这个类扩展而来。这四个类中的每一个都有一个功能相同的接口。

我想知道我是否将这个接口放在A 类中,所有这些类都可以访问它。我说的对吗?

我有另一个类G 正在实现这个接口。如果我实现这个接口,它是否同时适用于这四个库?

更新 让我详细介绍一下。 我有四节课。每个类都有一个方法,当这个类连接到互联网时会设置一个标志。像这样。

public class ClassB extends {

    public interface OnConnectingToServer {
        public void onGettingDataFromServer(boolean flag);
    }

    public ClassB () {
        if(I'm_downloading_from_internet)
                OnConnectingToServer.onGettingDataFromServer(true);
    }
}

我对“B”、“C”、“D”和“E”类有这种情况。 “G”类,实现了这个接口。因此,如果我想将每个接口放在每个类中,我需要分配四个不同的名称,并且在“G”类中也实现了 4 个接口。 我认为这种方式不是一个好方法。

我正在寻找一种方法,而不是实现 4 个相同的接口,而只实现一个接口。因此,无论是由一个类还是全部四个类触发接口,都只完成一个实现。

希望能更清楚。再次感谢。

【问题讨论】:

  • 如果您将接口实现从子类向上移动到其父类,则该类仍将应用于接口。能否请您澄清第二个问题?
  • 感谢 viktor,我更新了我的帖子
  • 我在构造函数中看不到任何ClassB 特定代码。你不能在A 的构造函数中这样做吗?每当您创建 BCDE 时,都会调用它。

标签: java inheritance interface


【解决方案1】:

不要将接口定义放在类 A 中。将其设为单独的顶级类型,然后将所有类设为 implements MyInterface。如果是class B extends A,那么您不必显式地说implements MyInterface,因为子类无法“取消实现”接口。

【讨论】:

    【解决方案2】:
    • 是的,如果您让A 实现一个接口,那么所有扩展该类的类也会实现该接口。
    • 不完全确定让G 实现接口是什么意思。这样做只会影响扩展 G 的类。

    【讨论】:

    • 感谢 Keppil,我已经更新了我的帖子,请再看一遍。谢谢。
    【解决方案3】:

    简而言之,是的。来自Java Language Spec

    一个类可以被声明为直接实现一个或多个接口, 意味着类的任何实例都实现了所有抽象 由接口或接口指定的方法。 一个类必然 实现其直接超类和直接的所有接口 超级接口可以。这个(多个)接口继承允许 支持(多个)常见行为而不共享任何对象的对象 实施。

    (我的重点)

    【讨论】:

      【解决方案4】:

      如果你在 A 类和 B 类中实现接口(称为 I),C + D 扩展 A,那么 B、C 和 D 也将实现 I 接口。

      这意味着你将能够写:

      I aInstance = new A();
      I bInstance = new B();
      

      还有:

      A aInstance = new A();
      A bInstance = new B():
      

      因为从逻辑上讲,您的数据模型将变为:

      A is an I 
      and  
      B is an A 
      so this implies:
      B is an I
      

      如果类 G 实现了接口但不继承 A,则您还必须在类 G 中实现 I 中定义的功能。

      这意味着你将能够写:

      I aInstance = new A();
      I gInstance = new G();
      

      但不是这个(这不会编译): A gInstance = new G();

      请记住,接口只是一个合同。任何实现接口的类都必须遵守约定,但不会继承任何实现(接口中无论如何都不能存在实现)。

      【讨论】:

        猜你喜欢
        • 2015-12-23
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        相关资源
        最近更新 更多