有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

重载是否可以重载抽象Java类中的抽象方法,但只实现子类中的一个重载方法?

我有一个抽象类(只显示相关部分),带有两个重载方法

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

在扩展这个抽象类的子类中,我只想使用带参数的子类,或者不带参数的子类,但决不能同时使用它们。比如

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

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

当然,这不会以这种方式编译,因为其他CreatePhysical方法没有在子类中实现。我快速而肮脏的解决方案是在子类中实现这两个方法,但未使用的方法将有空的主体

在Java8中有没有更优雅的解决方法


共 (2) 个答案

  1. # 1 楼答案

    用抽象的方法,就没有了。而且在句法层面上,它也不会听起来很好。如果有一个Component,那么可以同时调用这两个方法。人们应该如何知道哪一个得到了实施,哪一个没有得到实施

    我们可以在抽象类中定义这两个方法,并让它们抛出一个UnsupportedOperationException,例如,如果子类不希望抛出这样的异常,则可以强制它们重写(至少一个)这些方法。然而,这似乎是另一个问题的解决办法

    我建议重新评估该部分的整体架构,并找到解决问题的另一种方法。例如,可能两个独立的类和这些类的处理程序会产生一个更干净的体系结构

  2. # 2 楼答案

    当您想要在类中定义公共方法签名并强制子类为这些方法提供实现时,使用抽象类的想法就是这样。从这个角度来看,您试图实现抽象类的方式没有多大意义

    你也可以使用抽象类来定义一个基本类型来支持O-O特性,比如多态性和继承,我想这就是你想要做的。 如果是这种情况,我建议声明一个没有抽象方法的抽象类,或者为这两个方法声明一个带有默认实现的接口,然后可以在实现类中重写