实现接口而不实现它

时间:2014-09-08 20:18:51

标签: java inheritance

可以在不实现的情况下实现接口 - 如:

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。虽然。

2 个答案:

答案 0 :(得分:4)

如上所述,C类必须同时满足B.m2()A.m2()的合同。

这些合约要么兼容,要么不兼容。

如果这些合同兼容,那么B.m2()或者是C的充分实现。

  • 如果足够,则不需要覆盖。
  • 如果足够,则C类有责任覆盖它
    • 在C类中,您可以强制覆盖...只需覆盖该方法。
    • 在C类之外,您不能强制C覆盖现有的非抽象超类方法。

如果那些合同兼容,那么C不能同时扩展B并实现A.在这种情况下,你可以使用组合而不是继承 - 有C实现A,并在其表示中包括B.

Java中没有任何机制可以强制实现接口的所有可实例化类,以接口覆盖方法的超类实现。但是,您可以强制所有可实例化的类在其继承层次结构中的某个位置实现abstract方法。

答案 1 :(得分:1)

如果宣布B类是抽象的,则不需要实现m2,因此需要C(通过继承B):

abstract class B implements A {}