我被问到一个问题,我想在这里让我的答案复习。
问:在哪种情况下,扩展抽象类而不是实现接口更合适?
答:如果我们使用模板方法设计模式。
我对么 ?
很抱歉,如果我不能清楚地说明问题。 我知道抽象类和接口之间的基本区别。
1)在要求如此的情况下使用抽象类,即我们需要为特定操作(实现方法)在每个子类中实现相同的功能,而为某些其他操作(仅方法签名)实现不同的功能
2)如果需要使签名相同(且实现不同),请使用接口,以便可以遵循接口实现
3)我们可以扩展一个抽象类的最大值,但是可以实现多个接口
重申一个问题:除了上述提到的情况之外,还有其他具体需要使用抽象类的场景(可以看到模板方法设计模式仅在概念上基于此)吗?
接口与抽象类
在这两者之间进行选择确实取决于你要做什么,但幸运的是,对于我们来说,Erich Gamma可以为我们提供一些帮助。
一如既往地需要权衡取舍,接口为你提供了关于基类的自由,抽象类为你提供了以后添加新方法的自由。–埃里希·伽玛(Erich Gamma)
你必须先更改代码中的许多其他内容,然后才能去更改接口,因此避免这种情况的唯一方法是创建一个全新的接口,这可能并不总是一件好事。
Abstract classes应该主要用于紧密相关的对象。Interfaces擅长为不相关的类提供通用功能。
Interfaces
重申一个问题:除了上面提到的这些情况之外,还有其他任何情况,我们特别需要使用抽象类(可以看到模板方法设计模式仅在概念上基于此)
是的,如果你使用JAXB。它不喜欢接口。你应该使用抽象类或通过泛型解决此限制。
接口:
通常,应该使用接口来定义合同(要实现什么,而不是如何实现)。
抽象类:
抽象类应用于(部分)实现。它们可能是限制API合同实施方式的一种手段。