首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象基类与作为SuperType的具体类

抽象基类与作为SuperType的具体类
EN

Stack Overflow用户
提问于 2010-06-29 01:45:41
回答 8查看 8.9K关注 0票数 12

在阅读了最优秀的书"Head First Design Patterns“之后,我开始向我的同事们宣扬模式和设计原则的好处。在赞美我最喜欢的模式--策略模式的优点时,有人问我一个问题,让我停了下来。当然,策略使用继承和组合,当我的一位同事问到“为什么使用抽象基类而不是具体类?”时,我发表了一篇关于“对接口(或超类型)而不是实现进行编程”的长篇大论。

我只能想出“好吧,你强制你的子类实现抽象方法,并阻止它们实例化ABC”。但老实说,这个问题让我大吃一惊。在我的层次结构的顶层,使用抽象基类而不是具体类的唯一好处就是这些吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-06-29 01:53:34

如果需要实现特定的方法,则使用接口。如果存在可以拉出的共享逻辑,请使用抽象基类。如果基本功能集本身是完整的,那么您可以使用concreate类作为基本功能。抽象基类和接口不能直接实例化,这是优点之一。如果你可以使用一个具体的类型,那么你就需要重写方法,而这有一种“代码的味道”。

票数 22
EN

Stack Overflow用户

发布于 2010-06-29 01:56:13

编程到接口,而不是实现,与抽象和具体的类关系不大。还记得template method pattern吗?抽象或具体的类是实现细节。

使用抽象类而不是具体类的原因是,您可以在不实现方法的情况下调用方法,而是将它们留给子类来实现。

对接口进行编程则是另一回事--它定义的是API做什么,而不是它如何做。这是由接口表示的。

注意一个关键的区别-您可以使用protected abstract方法,这意味着这是实现细节。但是所有的接口方法都是公共的-- API的一部分。

票数 5
EN

Stack Overflow用户

发布于 2010-06-29 01:48:45

是的,尽管您也可以使用接口来强制类实现特定的方法。

使用抽象类而不是具体类的另一个原因是抽象类显然不能被实例化。有时,您也不希望发生这种情况,因此使用抽象类是可行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3134787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档