【问题标题】:Java: Force implementation of interface to extend abstract classJava:强制实现接口以扩展抽象类
【发布时间】:2012-10-08 20:10:13
【问题描述】:

我有几个类实现了接口 MyInterface,我希望它们都扩展抽象类 MyAbstractClass。最好的方法是什么?

有没有比创建另一个扩展 MyAbstractClass 并实现 MyInterface 的抽象类更好的方法?

(我发誓在发布之前我没有发现任何类似的问题)

【问题讨论】:

  • 这是唯一的方法。希望:)
  • 不,这种方式听起来是最好的方式。或者在您的文档中要求它。你为什么想要这种行为?
  • 谢谢。 noisecapella 我有几个类实现了我的接口“Listener”,我希望它们都是可观察的。最后我将“Listener”重写为抽象类 extends Observable。

标签: java interface abstract-class


【解决方案1】:

最简洁的解决方案是在接口的 JavaDoc 中定义这样的要求。在 JavaDoc 中,它应该声明类似“要使用此接口,您需要从 MyAbstractClass 扩展或提供您自己的实现”。这样,程序员负责实现。请记住,这是一个您试图解决技术性问题的社会学问题。

另一个“解决方案”是删除接口并使用抽象类。在抽象类中实现接口在这里没有意义。

【讨论】:

  • “另一个‘解决方案’是放弃接口并使用抽象类。” - 就是这个方法。谢谢。如果我有足够的声誉,我会投票 :)
【解决方案2】:

您可以定义MyAbstractClass 来实现MyInterface,然后让所有其他类扩展MyAbstractClass

public abstract class MyAbstractClass implements MyInterface {
    ...
}

public class OneOfSeveral extends MyAbstractClass {
    ...
}

【讨论】:

  • 那么接口有什么用呢?
  • 感谢 Jamie,但我不希望每个扩展 MyAbstractClass 的类都实现 MyInterface。 (我想要 MyInterface 的每个实现都扩展 MyAbstractClass 的另一种方式)
  • siebs0r 以 Jamie 所写的这种方式,可能有一些类只实现了 MyInterface 但不扩展 MyAbstractClass。但是按照我想要的方式,接口真的没用,所以我只创建了另一个抽象类,它扩展了 MyAbstractClass 并具有 MyInterface 中的抽象方法。
【解决方案3】:

您不能强制所有具体类以任何其他方式扩展 MyAbstractClass,而不是实际更改它们的定义

class A implements MyInterface

class A extends MyAbstractClass

当然

abstract class MyAbstractClass implements MyInterface

不过,您在编写时不需要另一个抽象类。

编辑:关于您在下面的评论:“我想要 MyInterface 的每个实现都扩展 MyAbstractClass 的另一种方式” - 您无法明智地执行此操作。您可以定义另一个MyInterface 扩展的接口,如果需要,可以调用MyAbstractClassInterface,但您仍然无法强制现有的类扩展实现后一个接口的抽象类,尽管它们当然必须实际实现该接口中定义的方法...

在我看来,您应该删除接口并用抽象类替换它。

干杯,

【讨论】:

  • 谢谢。这和杰米写的一样。但这不是真的,我不需要任何另一个抽象类。我可能需要来自 MyAbstractClass 的方法,而不需要来自 MyInterface 的方法。
  • 事实上,没有什么能阻止您在MyAbstractClass 中添加未在接口中定义的(抽象)方法并在具体类中实现前者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2010-10-21
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多