部分实现抽象类的抽象方法

时间:2016-07-06 15:50:02

标签: java oop interface abstract

我有一个抽象的类叫做 MyAbstractClass

我有5个不同的类来扩展它:类 A,B,.. E

我需要在 MyAbstractClass 类中添加 foo()方法,但只需 A,B和C 应该实现它,而 D E 永远不需要执行它。 (程序流程不会到达那里)

在Java中实现这种行为的好习惯是什么?

我应该使用界面吗?

我是否应该添加另一层继承,区分它们并仅在中间层添加foo?

感谢您的任何建议。

2 个答案:

答案 0 :(得分:5)

我在这里看到三种基本方法:

如果调用方法

,则子类不执行任何操作

在这种情况下,您可以记录呼叫或发出呼叫的警告,而不执行任何其他操作。

子类不应该执行方法

在这种情况下,您可以抛出UnsupportedOperationException

D和E与[A,B和C]根本不同

如果三个实现类的方式与D和E不同,请考虑创建三个父类,它们本身就是超类的子类。但是,如果所有五个类代表相似的概念,这可能没有意义。

为A,B和C设置接口

正如yuz和Eiko所建议的那样,你可以为这个只有A,B和C实现的特定方法建立一个接口。如果您正在处理超类引用类型,则可以检查是否obj instanceof MyInterface以确定是否应该运行该方法。

如果您正在使用Java 8+并且A,B和C的方法之间没有功能差异,您可以在接口中定义所有实现类可以使用的default方法。

答案 1 :(得分:1)

我看到两种方法:

  • 在父类中进行foo的默认实现,它不执行任何操作(空方法),而不是将其抽象化。在这种情况下,您可以根据需要覆盖后代类中的方法。

  • 创建包含foo的界面,并在ABC中实现该界面。在这种情况下,您需要在实际调用MyAbstractClass之前检查对象是否正在实现具有foo变量中对象引用的接口。