【问题标题】:Restrict classes that can implement interface in Java限制可以在 Java 中实现接口的类
【发布时间】:2015-10-08 05:48:44
【问题描述】:

在我们开始之前:我知道this question,在我的情况下,这个答案是行不通的。

假设我有:

interface Iface
class SuperClass (this one is from external library and can't be changed)
class SubClass extends SuperClass
class OtherClass

有没有办法让Iface 只能由SuperClass 及其子类实现?所以在这种情况下:

class SuperClass implements Iface - would be good if I could edit that class
class SubClass implements Iface   - good
class OtherClass implements Iface - bad

附带问题:这是违反 OOP 原则还是表明这样做是代码错误?

【问题讨论】:

  • 如果你最终限制了Iface的可能实现,这可能表明你试图使用错误工具来解决你的问题。
  • @Spotted 好吧,也许我是。我只是试图将它限制在有意义的类中。 Iterable 对集合有意义,但对整数或 PrintWriter 没有意义。在我的例子中,接口Iface 只对SuperClass 的子类有意义,但我想保留它一个接口。如果我让它们成为类,我就不能使用多重继承。如果不是Iface,而是Iface1Iface2Iface3,那将意味着创建7 个不同的类并扩展它们,而不是扩展SuperClass 并添加任何需要的接口。
  • 当然PrintWriter 实现Iterable 是没有意义的。但这对Iterable 界面的可见性/可访问性有影响吗?当然不是,因为只要合同履行完毕,每个人都应该被允许实现接口(=提供接口方法的实现)。
  • 所以我只是依靠以后使用该代码的人的常识(和 javadoc 阅读)?因为唯一阻止我把它变成类的是我需要多重继承。
  • 如果您想限制实现(无论出于何种原因),使用接口不会为您提供这种保证(因为它允许无限数量的可能实现)。根据您提供的上下文,我能给您的最佳建议是直接声明 SubClass 中的方法并将所有方法标记为 abstractfinal

标签: java oop inheritance


【解决方案1】:

我看到的唯一选择是将接口包私有并由位于同一包中的公共SuperClass 实现。这样,您的包的用户将能够继承SuperClass,但不能直接实现您的接口。请注意,尽管如此,界面本身变得不是很有用,因为外面的任何人都看不到它。

总的来说,您的问题似乎可以通过删除接口并将其替换为SuperClass来解决。

【讨论】:

  • 我突然想到我没有提到我不能修改 SuperClass 因为它来自外部库。我会适当地编辑问题
  • 然后按照 Tagir 写的去做,但是对于子类而不是超类。
【解决方案2】:

我相信并提到JavaDocs,一个public接口不能被阻止被继承。根据定义,接口旨在以这种方式工作,并且我们可以访问 Java 中的说明符和内容以使接口具有较低的可见性。不过很想展示一个方法。

【讨论】:

    【解决方案3】:

    虽然我完全同意@Tagir 的回答(并且相信它应该被接受),但公平地说,如果他使用自己的ClassLoader。另外,我认为如果构建自己的JVM-based 语言,这样的事情可以在编译时完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多