我被问到一个问题,我想在这里查看我的答案。
问: 在哪种情况下扩展抽象类比实现接口更合适?
A: 如果我们使用的是模板方法设计模式。
我对么 ?
如果我不能清楚地说明问题,我很抱歉。
我知道抽象类和接口之间的基本区别。
1)当要求我们需要在每个子类中为特定操作(实现方法)实现相同的功能而为其他一些操作(仅方法签名)实现不同的功能时,使用抽象类
2)如果您需要将签名相同(并且实现不同),请使用接口,以便您可以遵守接口实现
3)我们可以扩展一个抽象类的最大值,但可以实现多个接口
重申问题: 除了上面提到的那些之外,是否还有其他场景特别需要我们使用抽象类(一个是看到模板方法设计模式在概念上仅基于此)?
接口与抽象类
在这两者之间做出选择实际上取决于您想做什么,但对我们来说幸运的是,Erich Gamma 可以为我们提供一些帮助。
一如既往地需要权衡,接口让您可以自由选择基类,抽象类可以让您 自由地在以后添加新方法。 – 埃里希伽玛
如果不更改代码中 的许多其他内容,就无法更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事。
Abstract classes
应该主要用于密切相关的对象。 Interfaces
更擅长为不相关的类提供通用功能。
原文由 lowLatency 发布,翻译遵循 CC BY-SA 4.0 许可协议
何时使用接口
接口允许某人从头开始实现您的接口或使用其他代码实现您的接口,这些代码的原始或主要目的与您的接口完全不同。对他们来说,您的界面只是附带的,必须添加到他们的代码中才能使用您的包。缺点是接口中的每个方法都必须是公共的。您可能不想公开所有内容。
何时使用抽象类
相反,抽象类提供了更多的结构。它通常定义一些默认实现并提供一些对完整实现有用的工具。问题是,使用它的代码必须使用您的类作为基础。如果其他想要使用你的包的程序员已经独立开发了他们自己的类层次结构,那可能会非常不方便。在 Java 中,一个类只能继承自一个基类。
何时同时使用
您可以提供两全其美的方法,一个接口和一个抽象类。如果实施者愿意,他们可以忽略您的抽象类。这样做的唯一缺点是通过接口名称调用方法比通过抽象类名称调用方法稍慢。