为什么分离界面和实现?

One*_*ero 5 java architecture design-patterns

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

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 }
Run Code Online (Sandbox Code Playgroud)

为什么在这种情况下我们要分离接口及其实现?

或者这样说,为什么简单地有一个基类,让V2扩展/覆盖V1如下:

public class SomeComponent { // Some methods }
public class SomeComponentV2 extends SomeComponent 
{
  // Override methods for reimplementation
  // Add new methods for new features.
}
Run Code Online (Sandbox Code Playgroud)

itw*_*tme 0

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

public void methodInOuterClass(SomeComponent smCmp){
    smCmp.runInterfaceMethods();
}
Run Code Online (Sandbox Code Playgroud)

[编辑:这个问题出现在编辑之前的OP问题中]

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

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