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是管理员。 管理员无法订购视频,因此不需要接口所携带的方法。
答案 0 :(得分:3)
您可能想重新考虑您的设计。如果D
扩展A
,则D
应该执行A
所能做的所有事情,例如实现接口I
。这是OOP编程中非常重要的Liskov Substitution Principle的基础。
您可以重新设计设计,以便在保留逻辑继承的同时共享相关代码:
A
/|
D A' implements I
/|\
B C E
也可能(正如@OliCharlesworth所指出的)使用组合的解决方案可能更有用。这取决于具体情况,但如果B,C,D
和E
使用 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类中重写的类中覆盖它,这应该可以解决您的问题。 顺便说一句,默认方法不应该有任何内容让它正常工作