2.5 抽象类
OOD启思录
除了我们已经讨论过的类,还有一种重要的抽象类型是我们需要探讨的。请思考下列问题:你曾经吃过水果吗?你曾经吃过开胃菜吗?你曾经吃过甜点吗?很多人对这3个问题的答案都是“是”。只要你对这3个问题中的任一个回答了“是”,请你接着思考下面的问题:水果尝起来味道如何?一份甜点有多少卡路里的热量?一份开胃菜价格是多少?
我可以说,没有人吃过“水果”。很多人吃过苹果、香蕉或者桔子,但没有人吃过一个3斤重的、红色的就叫做“水果”的东西。类似地,当你坐在餐厅中,服务员走来问你想吃些什么时,你回答“一份开胃菜、一份主菜还有一份甜点”,如果这时服务员就转身走了,你就有麻烦了,因为你喜欢虾,而不喜欢瓜(两种可能的开胃菜)。我们认可,没有“水果”、“开胃菜”或者“甜点”这样的对象,但是这些名词确实表达了有用的信息。如果我拿起一只闹钟对你说:“你觉得我的水果怎么样?”你会认为我疯了;而如果我拿起一只苹果问同样的问题,你就会觉得很正常。“水果”这个称谓表达了有用的信息,虽然你不能创建水果对象。事实上,它是一个类(概念),但不知道如何实例化它这种类型的对象。
不知道如何实例化对象的类称为抽象类(abstract class)。
知道如何实例化对象的类称为具体类(concrete class)。
请留心我们经常使用的术语“抽象数据类型”(ADT)。有的时候,它被用作“类”的同义词,并且不区分抽象类和具体类。
在面向对象范型中,抽象类的一个重要用途是帮助创建继承层次结构。它们表达了类别名称(见图2.10)。我们将在第5章讨论它们的用处。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
时间: 2024-09-29 18:24:16