为什么要分离接口和实现



在生产代码中,我经常看到类定义如下:

public interface SomeComponent { // Some methods }
public class SomeComponentImpl implements SomeComponent { // Some methods}
public interface SomeComponentV2 extends SomeComponent { // Some methods }
public class SomeComponentV2Impl extends SomeComponentImpl implements SomeComponent { // Some methods }

为什么在这种情况下我们要分离接口和它的实现?

或者这样说,为什么仅仅有一个基类是不好的,让V2扩展/覆盖V1如下:

public class SomeComponent { // Some methods }
public class SomeComponentV2 extends SomeComponent 
{
  // Override methods for reimplementation
  // Add new methods for new features.
}

将接口和类的实现分开是一个很好的实践,因为您可以很容易地替换出类。

假设你想测试一个依赖于web服务的应用程序,该服务为你的每个请求收费。除了有一个类执行实际的请求到这个web服务,你可以建立一个类实现相同的接口,但返回假数据,以避免产生成本的每个请求。

每次从基类继承时,都有可能继承您根本不想继承的行为。接口是一种纯粹的契约,它使您可以自由地选择独立于所描述的优点的基类。

将接口与实现分离允许充分使用多态性。这样,SomeComponentV2Impl将有3种类型——自己的、基类和接口。在这里,您可以只使用接口,而不关心它在其他类中的实现。例如:

public void methodInOuterClass(SomeComponent smCmp){
    smCmp.runInterfaceMethods();
}

[编辑前这个问题出现在OP问题]

为什么我们不为它们使用一个基类呢?

因为SomeComponentV2Impl与SomeComponentImpl不同。但是如果它们实现了相同的接口,您将能够从接口的引用中调用它们的实现。

最新更新