【问题标题】:Being able to implement an interface only when the class inherit from a specific Class只有当类从特定类继承时才能实现接口
【发布时间】:2011-05-07 03:13:31
【问题描述】:

我正在用 java 编程。 假设我有一个“MyInterface”接口和一个“MyClass”抽象类。

我想确保实现“MyInterface”接口的每个类都继承自“MyClass”。 从 MyClass 继承的类完全能够不实现“MyInterface”接口。

这可能吗?谢谢。 如果我的英语不好,我很抱歉,但我是法语。

【问题讨论】:

    标签: java inheritance object


    【解决方案1】:

    我要确保每一堂课 实施“MyInterface” 接口继承自“MyClass”。

    不。那是不可能的。接口的全部意义在于使来自不同继承层次结构的类能够实现对一组预定义功能的支持。

    【讨论】:

      【解决方案2】:

      AFAIK,你不能直接这样做。

      泛型让你说这样的话,如果它有帮助的话:

      public <T extends MyClass & MyInterface> void foo(T param) { /**/ }
      

      因此,您只能使用 MyClass 和 MyInterface 的参数调用 foo()。

      或者,为什么不拥有两个抽象基类?

      abstract class MyClass { /* stuff here */ }
      abstract class MyInterfaceClass extends MyClass { /* empty */ }
      

      然后,使用 MyInterfaceClass 代替 MyInterface。

      或者,如果您只关心容器,请编写自己的:

      static class MyList extends ArrayList<MyInterface> {
          @Deprecated
          public boolean add(MyInterface obj) {
              assert obj instanceof MyClass;
              return super.add(obj);
          }
      
          public <T extends MyClass & MyInterface> boolean add(T obj) {
              return super.add(obj);
          }
      }
      

      然后,只要您犯了错误,就会收到弃用警告。

      但我的问题仍然存在 - 您要解决什么问题?您可以使用更具描述性的名称来代替“类”和“接口”吗?也许正确的解决方案是完全不同的。

      【讨论】:

      • 我想要MyClass的不同子类。其中一些可以存储在 List 中,而另一些则不能。
      • 此外,拥有一个实现 MyInterface 并且不是从 MyClass 继承的类可能会导致错误。我想在设计课程时避免愚蠢的错误。
      • 我正在创建一个具有实体(实体类)的视频游戏。其中一些具有真实位置(Spatial 类),其中一些具有整数位置(Tiled 类),其中一些根本没有位置(Logical 类)。任何实体都可以更新(可更新界面)或渲染(可绘制界面)。任何空间也可以被其他实体看到(可见界面)。拥有一个可见的逻辑是愚蠢的,就像拥有一个实现可更新并且不是从实体继承的类一样。如果我创建一个从 B 继承的新实体,我不应该编写 B 已经实现的接口。
      【解决方案3】:

      不,这是不可能的。任何类都可以实现MyInterface。没有办法将实现者限制为 MyClass 的子类。

      如果您真的需要这样的限制,我认为您将不得不不使用接口而是使用MyClass 代替接口。

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2018-05-28
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        相关资源
        最近更新 更多