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

是否可以在抽象Java类中重载抽象方法,但在子类中只实现一个重载方法?,java,overloading,abstract-class,Java,Overloading,Abstract Class,我有一个抽象类(只显示相关部分),它有两个重载方法 abstract public class Component { ... abstract protected void createPhysics(); abstract protected void createPhysics(Comp1D[] comp1DS); ... } 在扩展这个抽象类的子类中,我只想使用带参数的子类或不带参数的子类,但决不能同时使用这两个。比如说 public class Com

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

abstract public class Component {
    ...
    abstract protected void createPhysics();
    abstract protected void createPhysics(Comp1D[] comp1DS);
    ...
}
在扩展这个抽象类的子类中,我只想使用带参数的子类或不带参数的子类,但决不能同时使用这两个。比如说

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

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


在Java 8中有没有更优雅的方法来解决这个问题?

问题是,为什么要在这里使用抽象类。如果您计划使用带有默认实现的接口,该怎么办。您可以实现该接口并仅使用抽象方法重写所需的方法,但没有。而在句法层面上,它也不会是合理的。如果有一个
组件
,则可以调用这两种方法。如何知道哪一个已经实现,哪一个没有实现

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


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

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

要么您想让您的
后继类根据其自身的特定需求灵活地实现这两种方法,要么您想消除它们的复杂性,在抽象类中实现整个逻辑,您可以这样做:

abstract class Component() {

    protected void createDefaultPhysics() {
        //implement
    }

    abstract protected void createPhysics(Comp1D[] comp1DS);

}
以及你的具体课程:

public class Comp1D extends Component{

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

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

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

No,没有。在句法层面上,它也没有意义。如果有一个
组件
,则可以调用这两种方法。如何知道哪个实现了,哪个没有实现?@martin这不是一个好的设计,但是如果你仍然坚持让它以类似的方式工作,就不要在组件中将方法标记为抽象的,它们将只是空的,在子类中,你可以覆盖任何你想要的方法。仍然看不出目的,只是说…我想使用抽象类,因为所有的子类都必须有相同的方法,通常具有相同的参数列表。此createPhysics函数是我唯一的例外,因为my 1D组件包含相互耦合的物理,因此它们需要访问其他1D组件的属性。我对Java非常陌生(基本上我是被迫使用它的),我想我是从周一开始使用它的,所以我对我的可能性不是很熟悉。此外,我是物理学家而不是软件开发人员,所以我也不熟悉“干净”的体系结构。我要试试这个界面的东西!谢谢我已经“解决”了这个问题,在Comp1D类中声明了一个静态Comp1D[]数组,该数组是在所有1D组件初始化之后设置的。这样,每个1D组件都可以访问任何其他1D组件的属性,并且不需要将此数组作为createPhysics的参数。您认为这个解决方案怎么样?如何填充此阵列?
Comp1D
是一个多音键吗?如果一个存储了所有在这个数组中创建的
Comp1D
-对象,并且用户可以生成新的
Comp1D
-对象,那么这将是内存泄漏的java等价物,因为存储的
Comp1D
-对象只要存储在静态数组中就不能被垃圾收集。我认为这是一个multiton(对不起,我不是程序员,我只是在维基百科上读了multiton的定义。)首先,创建
Comp1D
对象(所有对象),然后用setter设置
comp1Ds
数组。在此之后,用户不应生成任何新的
Comp1D
对象。在此之后可以创建新对象,但在整个框架中,在创建第一批对象后创建新对象是不合逻辑的。
public class Comp1D extends Component{

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