一尘不染

ava中的抽象类与接口

java

我被问到一个问题,我想在这里让我的答案复习。

问:在哪种情况下,扩展抽象类而不是实现接口更合适?

答:如果我们使用模板方法设计模式。

我对么 ?

很抱歉,如果我不能清楚地说明问题。
我知道抽象类和接口之间的基本区别。

1)在要求如此的情况下使用抽象类,即我们需要为特定操作(实现方法)在每个子类中实现相同的功能,而为某些其他操作(仅方法签名)实现不同的功能

2)如果需要使签名相同(且实现不同),请使用接口,以便可以遵循接口实现

3)我们可以扩展一个抽象类的最大值,但是可以实现多个接口

重申一个问题:除了上述提到的情况之外,还有其他具体需要使用抽象类的场景(可以看到模板方法设计模式仅在概念上基于此)吗?

接口与抽象类

在这两者之间进行选择确实取决于你要做什么,但幸运的是,对于我们来说,Erich Gamma可以为我们提供一些帮助。

一如既往地需要权衡取舍,接口为你提供了关于基类的自由,抽象类为你提供了以后添加新方法的自由。–埃里希·伽玛(Erich Gamma)

你必须先更改代码中的许多其他内容,然后才能去更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事。

Abstract classes应该主要用于紧密相关的对象。Interfaces擅长为不相关的类提供通用功能。


阅读 371

收藏
2020-03-05

共1个答案

一尘不染

重申一个问题:除了上面提到的这些情况之外,还有其他任何情况,我们特别需要使用抽象类(可以看到模板方法设计模式仅在概念上基于此)

是的,如果你使用JAXB。它不喜欢接口。你应该使用抽象类或通过泛型解决此限制。

接口:

  1. 一个类可以实现多个接口
  2. 接口根本无法提供任何代码
  3. 接口只能定义公共静态最终常量
  4. 接口无法定义实例变量
  5. 添加新方法会对实现类产生连锁反应(设计维护)
  6. JAXB无法处理接口
  7. 接口不能扩展或实现抽象类
  8. 所有接口方法都是公开的

通常,应该使用接口来定义合同(要实现什么,而不是如何实现)。

抽象类:

  1. 一个类最多可以扩展一个抽象类
  2. 抽象类可以包含代码
  3. 抽象类可以定义静态常量和实例常量(最终)
  4. 抽象类可以定义实例变量
  5. 修改现有抽象类代码会对扩展类产生连锁反应(实现维护)
  6. 向抽象类添加新方法不会对扩展类产生连锁反应
  7. 抽象类可以实现接口
  8. 抽象类可以实现私有和受保护的方法

抽象类应用于(部分)实现。它们可能是限制API合同实施方式的一种手段。

2020-03-05