是否可以在抽象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.
我有一个摘要 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.