1.1.2 面向对象解决方案的特征
除非特别说明,本书中的某个问题的解决方案指计算机程序。程序包含一起工作的模块。模块是独立的代码单元,可以是单独的函数、类方法、类、一组一起紧密协作的函数或类,或者其他代码块。模块的准确定义取决于应用程序的类型以及大小。函数以及方法实现了算法,而算法是在有限时间内逐步完成任务的方法。算法经常执行的一个动作就是操作数据集合。
当设计解决方案时,需要创建一组优秀的模块。这些模块必须存储、移动并修改数据,并且使用方法彼此通信。当创建解决方案的时候必须组织数据集合,这样就可以方便地用算法要求的方式操作这些数据。实际上,本书大部分都在描述组织数据的方法。
注释:模块实现算法,而算法通常操作数据
面向对象编程语言允许创建对象的类。类将同一类型对象的属性(或者特征)以及对象的操作(或者行为)包含到同一个单元。类中指定的独立的数据项称为数据成员,类中指定的操作称为方法或者成员函数。属性通常是数据,而行为或者方法通常操作数据。在类似于C++、Java等的编程语言中,类为对象指定了属性和操作。
注释:对象封装了属性(数据)和行为(操作)
封装是隐藏内部细节的一种技术。函数封装了行为,而对象封装了数据以及行为。例如,时钟封装了时间(属性)以及某些操作,如设置或者显示时间。可以要求钟表执行这些操作,但是无法看到钟表如何完成这些操作(除非拥有透明的机械钟)。
注释:封装隐藏了内部细节
类可以从其他类继承属性以及操作。例如,一旦定义了一个钟表基类,就可以设计一个子类闹钟,闹钟继承钟表的属性并且添加一个提醒功能。创建闹钟类很容易,因为钟表类已经创建好了。因此,继承(面向对象的另一个概念)允许将先前定义的类用作其他目的,只需要扩展实现或者对实现作稍微的改动。
注释:继承支持软件重用
在特定的环境中,继承会使得编译器无法判断需要哪个操作。然而,多态(其字面意思为多种形式)可以在执行时做出这一判断。也就是说,某个特定操作的结果取决于执行操作的对象。例如,可以在程序中创建一个指向钟表对象的指针myClock,采用这种方法创建的指针既可以指向钟表,也可以指向闹钟。当要求myClock显示时间的时候,编译器无法判断是使用时钟实现显示时间还是使用闹钟实现显示时间,因为无法判断myClock所指对象所属的类。多态允许编译器在执行期之前将某个操作的含义标记为未知。
提示:面向对象编程的三个原则
1. 封装:对象包含数据以及操作。
2. 继承:类可以从其他类继承属性。
3. 多态:对象可以在执行时确定恰当的操作。