是否在给定代码中使用接口?

时间:2014-01-24 06:15:18

标签: java interface

我有以下代码:

public class TestClass extends NewClass {

    public static void main(String[] args) throws Exception {

    }

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub

    }

}

interface I {
    void doSomething();
}

abstract class NewClass implements I {
    // public abstract void doSomething();  // put doSomething() here and remove the interface or put doSomething() in the interface and implement it?

    public void myFunc() {
        doSomething();
    }

}

现在我的问题是:我应该将方法doSomething()放在抽象类中,还是应该创建一个单独的接口并将方法放在那里并让我的抽象类实现它?哪个好设计?请注意,No-interface方法已经在代码库中使用,但我仍然想知道将doSomething()放在接口中并实现接口会更好。或者我应该遵循以下的理念 - “不要因为你可以创建一个类/接口,如果你必须创建它。”

5 个答案:

答案 0 :(得分:2)

JLS声明如果抽象类中的所有方法都是抽象的,那么最好使用接口而不是抽象类。

如果你有非抽象方法,那么你必须使用抽象类,因为在接口中声明的方法是隐式的publicabstract。至于您的doSomething();方法,您可以定义它 - abstract或非abstract。如果它是抽象的,那么第一个具体的子类应该实现它。如果它不是抽象的,你仍然可以覆盖你的方法。

答案 1 :(得分:1)

这取决于所讨论的情况,但一般来说,如果方法(或方法组)在没有抽象类的上下文的情况下自己具有逻辑意义,那么使用接口是个好主意,即使你也是提供一个带有一些骨架(或空)实现的抽象类。这使测试人员和其他实施者能够以不同于您预期的方式自由地处理合同。

有关此模式的一个很好的示例,请参阅Java Collections框架。主集合接口都有附带的Abstract*类,以便于实现,但并不要求实现使用这些类,而专用的(如ORM框架)通常直接使用接口。

答案 2 :(得分:1)

这听起来像是一个意见问题 - 还有一些其他问题可以帮助您做出决定:

  • 您还有其他任何可以实现接口I的内容吗?如果没有,也许界面不起作用,并且没有必要。
  • 你的抽象类是否有任何实际功能?如果没有,也许它应该完全是一个界面。

答案 3 :(得分:0)

Java支持3种构造:

  1. - 完全实现(即;您必须为类中定义的所有函数提供正文)
  2. 抽象类 - 部分实现,部分未实现(可以有一些方法留给子类实现以提供更大的灵活性)
  3. 界面 - 完全未实现。 (实施班负责提供机构
  4. 现在完全取决于你的要求。

    接口也可用作合同,如果您要定义规则,则实施留给用户。

    抽象类在扩展它的类中有一些常用功能的情况下很有用。

答案 4 :(得分:0)

作为一个概念:

  1. 如果可以创建语句,请使用抽象类和继承 " A类是B级"。例如,你可以说, Inspiron N5010 是一台笔记本电脑
  2. 如果您可以发表声明" A能够使用接口 [做]作为",或者也是,抽象的类是什么,接口 班级可以做什么。例如,A Inspiron N5010笔记本电脑是 能够成为戴尔