我有以下代码:
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()放在接口中并实现接口会更好。或者我应该遵循以下的理念 - “不要因为你可以创建一个类/接口,如果你必须创建它。”
答案 0 :(得分:2)
JLS声明如果抽象类中的所有方法都是抽象的,那么最好使用接口而不是抽象类。
如果你有非抽象方法,那么你必须使用抽象类,因为在接口中声明的方法是隐式的public
和abstract
。至于您的doSomething();
方法,您可以定义它 - abstract
或非abstract
。如果它是抽象的,那么第一个具体的子类应该实现它。如果它不是抽象的,你仍然可以覆盖你的方法。
答案 1 :(得分:1)
这取决于所讨论的情况,但一般来说,如果方法(或方法组)在没有抽象类的上下文的情况下自己具有逻辑意义,那么使用接口是个好主意,即使你也是提供一个带有一些骨架(或空)实现的抽象类。这使测试人员和其他实施者能够以不同于您预期的方式自由地处理合同。
有关此模式的一个很好的示例,请参阅Java Collections框架。主集合接口都有附带的Abstract*
类,以便于实现,但并不要求实现使用这些类,而专用的(如ORM框架)通常直接使用接口。
答案 2 :(得分:1)
这听起来像是一个意见问题 - 还有一些其他问题可以帮助您做出决定:
I
的内容吗?如果没有,也许界面不起作用,并且没有必要。答案 3 :(得分:0)
Java支持3种构造:
现在完全取决于你的要求。
接口也可用作合同,如果您要定义规则,则实施留给用户。
抽象类在扩展它的类中有一些常用功能的情况下很有用。
答案 4 :(得分:0)
作为一个概念: