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