可以在不实现的情况下实现接口 - 如:
interface A { void m2(); }
class B { public void m2() { ... } }
class C extends B implements A { ... /* no implementation of m2() here */ }
我想知道的是,有没有办法强制后代类C
来实现方法m2()
?
这看起来有些侧面 - 打破了继承中的预期链。
有些情况我现在无法想到以这种方式强制子类的必要条件。
TIA。
// ==========================
编辑:一种情况:
在应用程序的两个不同位置开发了一个类B
和一个接口A
,方法m2()
在两者中具有相同的签名。
B
正在以自己的方式实施m2()
- 甚至不知道A
是什么。
当上面的C
快速进入时,其m2()
与A
中的合同无关。
这需要糟糕的发展管理。但是,仍然。
// =================================
EDIT-2:
限制m2() - B对包级别的访问权限或protected
有效。
这样,m2()
继承的B
的{{1}}将不会C
的{{1}},因为它不是A
。
这对于一个班级本身应该做什么有点温和 - 但事实并非如此。
一个超级班应该能够指导这个子。与在方法或类本身上使用public
松散相似。注意AndyThomas的有用的ans。虽然。
答案 0 :(得分:4)
如上所述,C类必须同时满足B.m2()
和A.m2()
的合同。
这些合约要么兼容,要么不兼容。
如果这些合同兼容,那么B.m2()
或者是C的充分实现。
如果那些合同不兼容,那么C不能同时扩展B并实现A.在这种情况下,你可以使用组合而不是继承 - 有C实现A,并在其表示中包括B.
Java中没有任何机制可以强制实现接口的所有可实例化类,以接口覆盖方法的超类实现。但是,您可以强制所有可实例化的类在其继承层次结构中的某个位置实现abstract
方法。
答案 1 :(得分:1)
如果宣布B类是抽象的,则不需要实现m2,因此需要C(通过继承B):
abstract class B implements A {}