如何防止接口在继承类中实现?

时间:2014-02-02 14:05:08

标签: java inheritance interface

interface I
class A implements I
class B extends A
class C extends A
class D extends A
class E extends A

我能做什么,只有D级才能得到I的方法。 我目前正在考虑在没有身体的情况下覆盖D中'I'的所有方法。

我是在朝着正确的方向思考还是有更好的方法?

编辑:D只是不想要接口I中包含的方法。其余的A方法都是继承的。 A是基类。界面我是订购视频的界面B,C,E是具有不同权限的用户,D是管理员。 管理员无法订购视频,因此不需要接口所携带的方法。

5 个答案:

答案 0 :(得分:3)

您可能想重新考虑您的设计。如果D扩展A,则D应该执行A所能做的所有事情,例如实现接口I。这是OOP编程中非常重要的Liskov Substitution Principle的基础。

您可以重新设计设计,以便在保留逻辑继承的同时共享相关代码:

    A
   /|
  D A' implements I
   /|\
  B C E

也可能(正如@OliCharlesworth所指出的)使用组合的解决方案可能更有用。这取决于具体情况,但如果B,C,DE 使用 A而不是 ,则A合成更合适。

答案 1 :(得分:0)

如果A实现了I,那么A或A的任何子类的任何用户都应该能够期望实现I的方法。这是A与该计划中其他课程的“合同”的一部分。

对于D从A继承,它应该是A的“特例”,并且应该实现A定义的所有功能。继承必然是一种“附加”工具;你可以获得基类中的所有内容,并可以在子类中更改或添加内容。

你说你想减去一些东西 - 这与面向对象的编程相反,而且与在语言中实现继承(和实现)的方式相反。

所以我认为最好的答案是“是的,有更好的方法。”我们无法用这么多信息来判断它是什么

答案 2 :(得分:0)

我会按如下方式完成此任务:

interface I
class superClassA
class A extends superClassA implements I
class B extends superClassA implements I
class C extends superClassA implements I
class D extends superClassA
class E extends superClassA implements I

与:

相同
interface I
class superClassA
class A extends superClassA implements I
class B extends A
class C extends A
class D extends superClassA
class E extends A

答案 3 :(得分:0)

您可能希望使用类似Adapter pattern.的内容,可用于隐藏或合并界面。

答案 4 :(得分:0)

使用java 8,您只需将接口I中的方法设为默认方法,并在要实现但未在D类中重写的类中覆盖它,这应该可以解决您的问题。 顺便说一句,默认方法不应该有任何内容让它正常工作