首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现接口而不实现接口

实现接口而不实现接口
EN

Stack Overflow用户
提问于 2014-09-08 20:18:51
回答 2查看 286关注 0票数 2

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

代码语言:javascript
复制
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。不过。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-08 20:58:39

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

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

如果这些契约是兼容的,那么那么B.m2()要么是C的一个足够的实现,要么不是。

  • 如果足够,则不需要重写。
  • 如果还不够,则C类有责任重写它。

代码语言:javascript
复制
- 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方法。

票数 4
EN

Stack Overflow用户

发布于 2014-09-08 20:23:13

如果您声明B类是抽象的,则不需要实现m2,因此C(通过继承B)将被要求:

代码语言:javascript
复制
abstract class B implements A {}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25732510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档