可以在不实现接口的情况下实现接口--如:
interface A { void m2(); }
class B { public void m2() { ... } }
class C extends B implements A { ... /* no implementation of m2() here */ } 我想知道的是,是否有一种方法可以强制子类C类在这里实现m2()方法?
这看上去有点偏侧--打破了预期的继承链。
在某些情况下,我现在想不出有必要以这种方式强制子类。
蒂娅。
//=。
编辑:一个场景:
在应用程序的两个不同位置开发了一个类B和一个接口A,在这两个地方都有一个具有相同签名的方法m2()。
B正在以自己的方式实现m2() --甚至不知道A是怎么回事。
当上面的C快速进入时,它有一个与A中的合同无关的m2()。
这就需要糟糕的发展管理。但是,仍然。
//=。
编辑-2:
限制m2()-of-B对包级的访问或protected工作。这样,m2() of B ( C正在继承的)并不适用于A,因为它不是public。
这是一个类本身应该做的事情的锻炼--但实际上并非如此。一个超类应该能够指挥这么多的潜艇。与在方法或类本身上使用final大致类似。注意AndyThomas的有用的ans。不过。
发布于 2014-09-08 20:58:39
正如所写的,类C必须同时满足B.m2()和A.m2()的合同。
这些合同要么兼容,要么不兼容。
如果这些契约是兼容的,那么那么B.m2()要么是C的一个足够的实现,要么不是。
- Inside class C, you can force an override by ... simply overriding the method.
- Outside class C, you cannot force C to override an existing, non-abstract superclass method.
如果这些合同与不兼容兼容,那么C就不能同时扩展B和实现A。在这种情况下,您可以使用组合而不是继承--让C实现A,并在其表示中包含B。
Java中没有强制所有实现接口的可实例化类来覆盖接口中方法的超类实现的机制。但是,您可以强制所有可实例化的类在继承层次结构中的某个位置实现abstract方法。
发布于 2014-09-08 20:23:13
如果您声明B类是抽象的,则不需要实现m2,因此C(通过继承B)将被要求:
abstract class B implements A {}https://stackoverflow.com/questions/25732510
复制相似问题