Java 中的抽象类与接口

我被问到一个问题,我想在这里得到我的答案审查。

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

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

我说的对吗?

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

1)当需求如此之大时,使用抽象类,我们需要在每个子类中为特定操作实现相同的功能(实现方法),并为其他一些操作实现不同的功能(仅方法签名)

2)使用接口,如果需要把签名放到一样(和实现不同),这样就可以符合接口实现

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

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

接口与抽象类

在这两者之间进行选择实际上取决于您想做什么,但幸运的是,Erich Gamma可以帮助我们一点。

与往常一样,存在权衡,接口为您提供了有关基类的自由,抽象类使您以后可以自由地添加新方法。– 埃里希·伽玛

你不能在不改变代码中的许多其他东西的情况下去改变一个接口,所以避免这种情况的唯一方法是创建一个全新的界面,这可能并不总是一件好事。

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


答案 1

何时使用接口

接口允许某人从头开始实现您的接口,或者在原始或主要用途与您的接口完全不同的其他代码中实现您的接口。对他们来说,你的界面只是偶然的,必须添加到他们的代码中才能使用你的包。缺点是接口中的每个方法都必须是公共的。您可能不想公开所有内容。

何时使用抽象类

相比之下,抽象类提供了更多的结构。它通常定义一些默认实现,并提供一些对完整实现有用的工具。问题是,使用它的代码必须使用你的类作为基础。如果其他想要使用您的包的程序员已经独立开发了自己的类层次结构,这可能非常不方便。在 Java 中,一个类只能从一个基类继承。

何时同时使用两者

您可以提供两全其美的,一个接口和一个抽象类。如果实现者愿意,他们可以忽略抽象类。这样做的唯一缺点是通过接口名称调用方法比通过其抽象类名调用它们稍微慢一些。


答案 2

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

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

来自个人博客文章

接口:

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

通常,接口应该用于定义契约(要实现什么,而不是如何实现它)。

抽象类:

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

抽象类应该用于(部分)实现。它们可以成为限制 API 协定应实现方式的一种手段。


推荐