是否可以在抽象Javaclass中重载抽象方法,但在子class中只实现其中一个重载方法?

Is it possible to overload abstract methods in an abstract Java class, but implement only one of the overloaded methods in subclass?

我有一个摘要 class(仅显示相关部分),其中包含两个重载方法。

abstract public class Component {
    ...
    abstract protected void createPhysics();
    abstract protected void createPhysics(Comp1D[] comp1DS);
    ...
}

在扩展此摘要的子classes 中class 我只想使用带参数或不带参数的那个,但绝不会同时使用它们。例如

public class Comp1D extends Component{
    ...
    protected void createPhysics(Comp1D[] comp1Ds){
        ...
    }
}

public class Comp3D extends Component{
    ...
    protected void createPhysics(){
        ...
    }
}

当然,这不会以这种方式编译,因为另一个 createPhysics 方法没有在 subclass 中实现。我快速而肮脏的解决方案是在 subclasses 中实现这两种方法,但未使用的方法将有空体。

Java8有没有更优雅的解法?

问题是,为什么要在这里使用摘要class。如果您计划使用具有默认实现的接口怎么办。您可以实现接口并仅覆盖所需的方法

有了抽象方法,就没有了。在句法层面上,它也不合理。如果有 Component,则可以调用这两种方法。怎么知道哪一个实现了,哪一个没有实现?

可以在抽象中定义这两个方法 class 并让它们抛出,例如 UnsupportedOperationException,从而强制子类覆盖(至少其中一个)这些方法,如果他们愿意的话不会抛出这样的异常。然而,这似乎是另一个问题的解决方法。

我会建议 re-evaluating 该部分的总体架构,并找到问题的另一种解决方案。例如,也许两个分开的 classes 和那些 classes 的处理程序会产生更清晰的架构。

正如@Turning85 所指出的,这样的实现没有多大意义。

要么您想让您的 successor class 能够根据自己的特定需要灵活地实施这两种方法,要么您想要摆脱这种复杂性并实施整个摘要中的逻辑 class,你可以有这样的东西:

abstract class Component() {

    protected void createDefaultPhysics() {
        //implement
    }

    abstract protected void createPhysics(Comp1D[] comp1DS);

}

和你的具体 classes:

public class Comp1D extends Component{

      protected void createPhysics(Comp1D[] comp1Ds){
           if(comp1Ds == null) {
                createDefaultPhysics();
           }
      }
}

使用抽象 class 的想法是当您想在 class 中定义公共方法签名并强制 sub-classes 为此类方法提供实现时。从这个角度来看,您尝试实现抽象 class 的方式没有多大意义。

您还可以使用抽象 class 来定义基类型以支持 O-O 多态性和继承等特性,我认为这就是您想要做的。 如果是这种情况,我建议声明一个没有抽象方法的抽象 class 或声明一个具有这两种方法的默认实现的接口,然后您可以在实现中覆盖 classes.