【问题标题】:How to prevent an Interface from implementing in inherited class?如何防止接口在继承类中实现?
【发布时间】:2014-02-02 14:05:08
【问题描述】:
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 是基类。界面 I 是订购视频的界面 B、C、E 是具有不同权限的用户,D 是管理员。 管理员不能点视频,所以不需要接口自带的方法。

【问题讨论】:

  • 这与继承的含义完全相反。 en.wikipedia.org/wiki/Liskov_substitution_principle你应该重新考虑你的设计。
  • 这不清楚。你是说你想让D 继承自A,但没有A 的任何方法?这没有任何意义。
  • 如果 D 不是 A,为什么 D 从 A 继承?
  • 你想用这个设计完成什么?
  • @user3262900 您应该添加评论而不是编辑您的帖子。如果A 实现ID 扩展A 但没有实现I,您的设计仍然会被破坏。查看之前链接的 LSP。

标签: java inheritance interface


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

如果 A 实现了 I,那么 A 的任何用户或 A 的任何子类都应该能够期望 I 的方法被实现。它是 A 与程序中其他类的“契约”的一部分。

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

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

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

【讨论】:

    【解决方案3】:

    我会按如下方式完成:

    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
    

    【讨论】:

      【解决方案4】:

      您可能希望使用Adapter pattern. 之类的东西,可用于隐藏或合并界面。

      【讨论】:

        【解决方案5】:

        使用 java 8,您可以将接口 I 中的方法设置为默认方法,并在您希望在其中实现但不在 D 类中覆盖的类中覆盖它,这应该可以解决您的问题。 顺便说一句,默认方法的主体中不应该有任何东西才能正常工作

        【讨论】:

          猜你喜欢
          • 2014-08-13
          • 2023-03-25
          • 1970-01-01
          • 2019-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          • 2011-11-21
          相关资源
          最近更新 更多