2.1.3 面向对象的程序设计

对象是面向对象方法中最基本的概念。对象可以用来表示客观世界中的任何实体,也就是说,应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界意义的东西。总之,对象是对问题域中某个实体的抽象,设立某个对象就反映软件系统保存有关它的信息并具有与它进行交互的能力。

面向对象的程序设计方法中涉及的对象是系统中用来描述客观事物的一个实体,是构成系统的一个基本单位,它由一组表示其静态特征的属性和它可执行的一组操作组成。

对象可以做的操作表示它的动态行为,在面向对象分析和面向对象设计中,通常把对象的操作也称为方法或服务。

属性即对象所包含的信息,它在设计对象时确定,一般只能通过对象的操作来改变。

操作描述了对象执行的功能,若通过消息传递,还可以为其他对象使用。操作过程对外是封闭的,即用户只能看到这一操作实施后的结果。这相当于事先已经设计好的各种过程,用户只要调用就可以了,而不必关心这一过程是如何编写的。事实上,这个过程已经封装在对象中,用户也看不到。这一特性即是对象的封装性。

1.面向对象特点

面向对象具有封装性、继承性和多态性。

(1)封装性

封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接收哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象的使用者分开,使用者不必知晓行为实现的细节,只需用设计者提供的消息来访问该对象即可。

(2)继承性

继承性是子类自动共享父类之间数据和方法的机制,它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。继承具有传递性,继承分为单继承(一个子类只有一个父类)和多重继承(一个类有多个父类)。类对象是各自封闭的,如果没继承性机制,则类对象中的数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。

(3)多态性

对象根据所接收的消息而做出动作。同一消息为不同的对象接收时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接收消息的对象自行决定,同一消息即可调用不同的方法。例如,Print消息被发送给图或表时调用的打印方法与将同样的Print消息发送给正文文件而调用的打印方法可能完全不同。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在面向对象的编程语言中可通过在派生类中重定义基类函数(定义为重载函数或虚函数)来实现多态性。

2.类和实例

类是对象的模板,即类是对一组有相同数据和相同操作的对象的定义。一个类所包含的方法和数据可描述一组对象的共同属性和行为,将属性、操作相似的对象归为类,也就是说,类是具有共同属性、共同方法的对象的集合。所以,类是对象的抽象,它描述了属于该对象类型的所有对象的性质,而一个对象则是其对应类的一个实例。

需要注意的是,当使用“对象”这个术语时,既可以指一个具体的对象,也可以泛指一般的对象。但是,当使用“实例”这个术语时,必然是指一个具体的对象。

由类的定义可知,类是关于对象性质的描述,它同对象一样,包括一组数据属性和在数据上的一组合法操作。

在UML语言中,类的表示如图2-4所示。

图2-4 UML语言中的类

3.消息

面向对象的世界是通过对象与对象间彼此的相互合作来推动的,对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间传递的信息,它是对象执行某一处理或回答某一要求的信息,它统一了数据流的控制流。消息的使用类似于函数调用,消息中指定了某一个实例、一个操作名和一个参数表(可为空)。接收消息的实例执行消息中指定的操作,并将形式参数与参数表中相应的值结合起来。在消息传递过程中,由发送消息的对象(发送对象)的触发操作产生输出结果,作为消息传送至接收消息的对象(接收对象),引发接收消息对象的一系列的操作。所传送的消息实质上是接收对象所具有的操作/方法名称,有时还包括相应参数。

通常,一个消息由以下3部分组成:

1)接收消息的对象的名称。

2)消息标识符(也称为消息名)。

3)0个或多个参数。