我有一个抽象的类叫做 MyAbstractClass 。
我有5个不同的类来扩展它:类 A,B,.. E
我需要在 MyAbstractClass 类中添加 foo()方法,但只需 A,B和C 应该实现它,而 D 和 E 永远不需要执行它。 (程序流程不会到达那里)
在Java中实现这种行为的好习惯是什么?
我应该使用界面吗?
我是否应该添加另一层继承,区分它们并仅在中间层添加foo?
感谢您的任何建议。
答案 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
的界面,并在A
,B
和C
中实现该界面。在这种情况下,您需要在实际调用MyAbstractClass
之前检查对象是否正在实现具有foo
变量中对象引用的接口。