2.1 对象
对象是理解面向对象技术的关键概念。生活中有很多对象的例子,如狗、桌子、电视机、自行车等。
生活中的对象都有两个共同的属性:状态和行为。狗有名字、颜色、品种等状态,以及犬吠、抓东西、摇尾巴等行为。自行车有当前档位、当前脚踏频率、当前速度等状态和换档、变换踏板频率、刹车等行为。根据面向对象编程的思路来确定生活中对象的状态和行为是很好的方法。
前面已经介绍了生活中的几个对象。对每个对象,都有两个问题:“它处于什么状态”和“它会发生什么行为”。仔细观察并写下这些状态和行为,会发现生活中的对象差别很大。例如,台灯只有两个状态(开、关)和两种行为(打开、关闭),而收音机有其他状态(开、关、当前音量、当前电台)和行为(打开、关闭、提高音量、降低音量、搜索、扫描、调频)。而且,有些对象还包含其他对象。这些观察结果都可以翻译成面向对象程序。
就概念而言,软件对象与生活中的对象类似,也包含状态和行为两大属性。如图2-1所示,软件对象用字段(field,有些程序语言称为变量,variable)存储状态,用方法(method,有些程序语言称为函数,function)定义行为。方法对对象的内部状态进行操作,是对象之间通信的基本机制。这种隐藏对象内部状态,要求所有通信都通过对象的方法实现的行为,是面向对象编程的基本原则,通常称为数据封装。
图2-2以自行车为例来说明。外界如何使用对象,取决于其状态(当前档位、当前脚踏频率、当前速度)和改变状态的方法。如果自行车只有6个档位,就不能将其换成低于1或大于6的档位。
将代码构建成独立的软件对象,具有以下优点:
1)模块化。每个对象的源代码,其编写和维护都独立于其他对象。对象一旦创建,就很容易在系统内传送。
2)信息隐藏。用户只能与对象的方法交互,对象的内部实现细节对外界是隐藏的。
3)代码重用。如果对象已经创建(可能是其他开发人员编写),就可以直接使用该对象。这样一来,写程序时就可以直接调用那些由专家实现、测试和调试通过的复杂、特定功能的对象。
4)可插拔和易于调试。当个别对象出问题时,可以将其从程序中移除,并插入另一个对象来替换它。这与现实生活中的维修机制类似。比如说,机器的螺栓坏了,只需更换该螺栓,而不需要更换整台机器。