问题描述
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(){
...
}
}
当然,由于子类中未实现其他createPhysics方法,因此不会以这种方式进行编译。我的快速而肮脏的解决方案是在子类中实现这两种方法,但是未使用的方法将具有空主体。
在Java 8中是否有更优雅的解决方法?
解决方法
没有抽象方法。从句法层面上讲,这也不是很合理。如果一个人拥有Component
,则可以调用这两个方法。谁应该知道哪个实施了呢?
可以在抽象类中定义这两种方法,并让它们抛出例如UnsupportedOperationException
,从而如果子类希望不抛出此类异常,则迫使子方法重写(至少其中一种)方法。但是,这似乎是另一个问题的解决方法。
我建议重新评估该部分的总体架构,并找到解决该问题的另一种方法。例如,也许两个分离的类和这些类的处理程序将产生一个更简洁的体系结构。
,问题是,为什么要在这里使用Abstract类。如果您打算使用具有默认实现的接口该怎么办。您可以实现接口并仅覆盖所需的方法
,使用抽象类的想法是当您要在类中定义通用方法签名并强制子类为此类方法提供实现时。从这个角度来看,您尝试实现抽象类的方式没有多大意义。
您还可以使用抽象类定义基本类型以支持O-O功能(例如多态性和继承),我想这就是您要尝试做的事情。 如果是这种情况,我建议声明一个没有抽象方法的抽象类,或者为两个方法声明一个具有默认实现的接口,然后可以在实现类中进行覆盖。
,正如@ Turning85指出的那样,这种实现没有多大意义。
您要么想让自己的successor
类灵活地根据它们自己的特定需求来实现这两种方法,要么想摆脱这种复杂性并在抽象类中实现整个逻辑,您可能会遇到这样的事情:
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();
}
}
}