【问题标题】:How to force implementation of a nested abstract class in an abstract class in Java?如何在 Java 的抽象类中强制实现嵌套抽象类?
【发布时间】:2012-04-25 15:28:55
【问题描述】:

我是 Java 新手,但习惯于 OOP 编程。有没有一种方法可以强制实现嵌套到另一个抽象类中的抽象类,如下面的代码:

public abstract class A
{

    public abstract class B extends C
    {
        @Override
        public abstract void foo();

    }

}

我希望 B 在 A 的每个子类中实现。有可能吗?

感谢您的帮助,

【问题讨论】:

  • 您想强制 A 的每个子类都包含一个实现 B 的嵌套类吗?纯 Java 方法是不可能的。
  • 您是说您希望 A 的每个子类也是 B 的子类还是包含 B 的子类?
  • 仅供参考,我相信这里真正的解决方案是让 A 扩展 C。如果 A 的子类选择通过另一个子类实现 C,那就是子类的选择。

标签: java class nested abstract


【解决方案1】:

如果我正确阅读了您的问题,您希望 A 的每个子类都包含 B 的子类,那么没有直接的方法可以做到这一点。但是,您可以执行以下操作:

public abstract class A
{

  public abstract class B extends C
  {
      @Override
      public abstract void foo();
   }

   protected abstract B getBInstance();
}

因为这会强制 A 的子类返回 B 的实例,所以它们必须能够访问 B 的某个子类。

但是,您应该真正问问自己,为什么 A 应该关心其实现 B 的子类,除非 A 以某种需要上述方式的方式使用 B。

【讨论】:

    【解决方案2】:

    是的,将B设为接口,如When an Abstract Class Implements an Interface所示。

    【讨论】:

    • 我认为这不能回答问题。无论 B 是抽象类、接口还是其他什么,您都可以很好地将 A 扩展到具体类。
    • 好点,但我理解的问题是关于如何以编译器可以强制执行的方式从A 派生时推迟foo() 的实现。否则,这似乎是不可能的。当然,我欢迎反例。
    • 我相信我的回答提供了一种可能性。我并不是说这是一个好的设计,但它会强制 A 的每个子类都可以访问 B 的子类。
    【解决方案3】:

    这是不可能的。 A 类应该只提供 A 的实例具有的行为(通过抽象或实现的方法)。它不应该说明 A 是如何实现的。

    甚至不清楚这会有什么用,因为您无法调用已实现的类 B,因此需要将其命名为其他名称,这意味着可以忽略它的存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 2012-09-02
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2017-02-27
      相关资源
      最近更新 更多