【问题标题】:Implementing a interface and extending an class that implements the same interface? [duplicate]实现一个接口并扩展一个实现相同接口的类? [复制]
【发布时间】:2015-12-10 15:24:02
【问题描述】:

实现一个接口并扩展一个实现相同接口的类会导致任何问题吗? (除了混淆)

例如:

interface IDo
public abstract class DoIt implements IDo
public class IllDo extends DoIt implements IDo

(请忽略它似乎是错误的)

【问题讨论】:

  • 应该没有问题,同一个接口实现两次是多余的

标签: java interface


【解决方案1】:

当你扩展一个类时,你继承了它的整个接口,包括它实现的任何接口或它派生的类。因此,任何扩展DoIt 的类自动 实现IDo,就其本质而言,它扩展了实现它的类。您可以将implements 子句放在声明中,但它对类没有任何进一步的影响。但是,可能有这样做的理由,正如this question 的答案中所述:它记录了您特别打算让该类实现接口,这意味着如果将超类修改为不再包含 implements 子句,子类要么中断(因为它缺少接口所需的东西)要么保持其原始合同。

【讨论】:

  • 重新声明接口可能至少应该在你的IDE中抛出一个警告,但它不太可能导致问题(除了可能需要IllDo直接覆盖IDo中的每个成员)。
  • 我无法决定它是不执行操作(看到超类已经拥有这些方法)还是强制子类提供自己的方法。
  • 为 TJ Crowder 和 @Draco18s 加油,很高兴知道我现在可以安全(但感觉不对)使用此代码。在正常情况下确实是毫无意义的,但我的情况确实需要这种解决方案。
  • @T.J.Crowder 从我的角度来看,这并非毫无意义/具有误导性。实际上非常流行的java.util.Collection 框架遵循相同的约定。 Why does ArrayList have “implements List”? ,但我知道这纯粹是基于意见。 (最终,无论哪种方式都不会产生任何影响)。
  • @T.J.Crowder 是的,我同意。可能是旧版本是否支持此功能,我不确定。但是,在 IDE 中开发/维护代码时,如果我们需要查看 ArrayList 或此处 IllDo 类的层次结构,我们需要查看它的父类,即它是任何类型的(意思是实现一个界面)。因此,如果我们添加implements 子句,很容易知道它的类型并且很容易遍历/移动代码。 (仍然基于意见):P :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2012-10-13
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多