首先,Java 中的接口(从 Java 7 开始)没有代码。这只是一个定义,一个类必须履行的契约。
那么有一个共同的定义有什么问题(不是完美的
通用实现)接口方法,然后覆盖它
任何必要的地方,为什么java不支持它
是的,你可以在 Java 中做到这一点,只是不能只使用接口。假设我想从这个Example 接口中获得method1 的默认实现,但让method2 未实现:
interface Example {
public void method1();
public String method2(final int parameter);
}
abstract class AbstractExampleImpl implements Example {
@Override
public void method1() {
// Implement
}
}
现在想要使用这个method1 默认实现的类可以扩展AbstractExampleImpl。这比在接口中实现代码更灵活,因为如果您这样做,那么所有类都绑定到您可能不想要的实现。这就是接口的优点:能够引用某个行为(contract),而不必知道类实际是如何实现的,例如:
List<String> aList = MyListFactory.getNewList();
MyListFactory.getNewList() 可以返回任何实现List 的对象,我们处理aList 的代码根本不关心,因为它是基于接口的。
如果使用接口的类已经是子类怎么办。然后我们
不能使用抽象类,因为不支持多重继承
我猜你的意思是这种情况:
class AnotherClass extends AnotherBaseClass
你也想扩展AbstractExampleImpl。是的,在这种情况下,不可能使 AnotherClass 扩展 AbstractExampleImpl,但您可以编写一个包装的内部类来执行此操作,例如:
class AnotherClass extends AnotherBaseClass implements Example {
private class InnerExampleImpl extends AbstractExampleImpl {
// Here you have AbstractExampleImpl's implementation of method1
}
}
然后,您可以通过调用 InnerExampleImpl 的方法在内部使所有 Example 方法实际实现。
AnotherClass中必须要有接口吗?
我猜你的意思是AnotherClass implements Example。好吧,这就是你想要的:让AnotherClass 用一些默认实现实现Example 并扩展另一个类,否则我理解你错了。由于您不能扩展多个类,因此您必须实现接口以便您可以这样做
final Example anotherClass = new AnotherClass();
否则这是不可能的。
对于每个实现接口的类,我是否必须设计
内部类?
不,它不必是内部类,这只是一个示例。如果您希望多个其他类具有此默认 Example 实现,您可以编写一个单独的类并将其包装在您想要的所有类中。
class DefaultExampleImpl implements Example {
// Implements the methods
}
class YourClass extends YetAnotherClass implements Example {
private Example example = new DefaultClassImpl();
@Override
public void method1() {
this.example.method1();
}
@Override
public String method2(final int parameter) {
return this.example.method2(parameter);
}
}