在阅读了最优秀的书"Head First Design Patterns“之后,我开始向我的同事们宣扬模式和设计原则的好处。在赞美我最喜欢的模式--策略模式的优点时,有人问我一个问题,让我停了下来。当然,策略使用继承和组合,当我的一位同事问到“为什么使用抽象基类而不是具体类?”时,我发表了一篇关于“对接口(或超类型)而不是实现进行编程”的长篇大论。
我只能想出“好吧,你强制你的子类实现抽象方法,并阻止它们实例化ABC”。但老实说,这个问题让我大吃一惊。在我的层次结构的顶层,使用抽象基类而不是具体类的唯一好处就是这些吗?
发布于 2010-06-29 01:53:34
如果需要实现特定的方法,则使用接口。如果存在可以拉出的共享逻辑,请使用抽象基类。如果基本功能集本身是完整的,那么您可以使用concreate类作为基本功能。抽象基类和接口不能直接实例化,这是优点之一。如果你可以使用一个具体的类型,那么你就需要重写方法,而这有一种“代码的味道”。
发布于 2010-06-29 01:56:13
编程到接口,而不是实现,与抽象和具体的类关系不大。还记得template method pattern吗?抽象或具体的类是实现细节。
使用抽象类而不是具体类的原因是,您可以在不实现方法的情况下调用方法,而是将它们留给子类来实现。
对接口进行编程则是另一回事--它定义的是API做什么,而不是它如何做。这是由接口表示的。
注意一个关键的区别-您可以使用protected abstract方法,这意味着这是实现细节。但是所有的接口方法都是公共的-- API的一部分。
发布于 2010-06-29 01:48:45
是的,尽管您也可以使用接口来强制类实现特定的方法。
使用抽象类而不是具体类的另一个原因是抽象类显然不能被实例化。有时,您也不希望发生这种情况,因此使用抽象类是可行的。
https://stackoverflow.com/questions/3134787
复制相似问题