在生产代码中,我经常看到如下定义的类:
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.
}
答案 0 :(得分:1)
将接口和类的实现分开是一个很好的做法,因为您可以轻松地交换类。
想象一下,您想要测试依赖于Web服务的应用程序,该服务会为您的每个请求收取费用。除了有一个对此Web服务执行实际请求的类之外,您还可以构建一个实现相同接口但返回虚假数据的类,以避免为每个请求生成成本。
每次从基类继承时,您都有可能继承您根本不想继承的行为。接口是纯合约,让您可以自由选择基础类,而不受所述优势的影响。
答案 1 :(得分:0)
将接口与实现分离可以完全使用多态。 这样,SomeComponentV2Impl将有3种类型 - 拥有,基类和接口。 在这里,您可以只使用界面而不关心它在其他课程中的实现。例如:
git submodule add git://github.com/whomsoever/whatever.git
[编辑:此问题出现在编辑前的OP问题中]
为什么我们不为它们使用一个基类?
因为SomeComponentV2Impl与SomeComponentImpl不同。 但如果他们实现相同的界面,您将能够从界面的参考中调用他们的实现。