软件工程第七讲教案 下载本文

1)从动态的观点来看,对象的操作就是对象的行为。问题空间对象的行为是极其丰富多彩的,而解空间对象的行为是极其死板的。因此,只有借助于极其复杂的算法才能操纵解空间对象而得到解。传统的程序设计语言限制了程序员定义解空间对象。而面向对象语言提供了对象概念,这样,程序员就可以自己去定义解空间对象。

2)从存储的角度来看,对象是私有存储.其中有数据也有方法。其他对象的方法不能直接操纵该对象的私有数据,只有对象私有的方法才可操纵它。 3)从对象的实现机制来看,对象是一台自动机,其中私有数据表示了对象的状态,该状态只能由私有的方法改变它。每当需要改变对象的状态时,只能由其他对象向该对象发送消息,对象响应消息后按照消息模式找出匹配的方法,并执行该方法。

4)在面向对象的程序设计中,对象是系统中的基本运行实体。对象占有存储空间且具有传统程序设计语言的数据,如数字、数组、字符和记录等。给对象分配存储单元就确定了给定时刻对象的状态,与每一个对象相关的方法定义该对象的操作。

对象的两个主要因素是属性和服务,其定义如下: 属性是用来描述对象静态特征的一个数据项。

服务是用来描述对象动态特征(行为)的一个操作序列。

一个对象可以有多项属性和多项服务。一个对象的属性和服务被结合成一个整体,对象的属性值只能由这个对象的服务存取。

对象标识是对象的另一要素。对象标识也就是对象的名字,有外部标识和内部标识之分。前者供对象的定义者或使用者用,后者供系统内部唯一地识别对象。

另外需要说明以下两点:第一点是,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。这就是说,对象是对事物的抽象描述。第二点是,对象是属性和服务的结合体,二者是不可分的;而且对象的属性值只能由这个对象的服务来读取和修改,这就是后文将要讲述的封装概念。

对象定义如下:对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。

系统中的一个对象,在软件生命周期的各个阶段可能有不同的表示形式。例如,在分析与设计阶段是用某种 OOA/OOD方法所提供的表示法给出比较粗略的定义,而在编程阶段则要用一种OOPL写出详细而确切的源程序代码。这就是说,系统中的对象要经历若干演化阶段,虽然其表现形式各不相同,但在概念上是一致的,都是问题域中某一事物的抽象表示。 2. 消息和方法

9

(1) 消息

对象通过它对外提供的服务在系统中发挥自己的作用。当系统中的其它对象(或其它系统成分)请求这个对象执行某个服务时,它就响应这个请求,完成服务所要求的职责。在 OO方法中把面向对象发出的服务请求称作消息。消息用来请求对象处理或回答某些信息的要求,消息统一了数据流和控制流;某一对象在执行相应的处理时,如果需要,它可以通过传递消息请求其他的对象完成某些处理工作或回答某些信息;其他对象在执行所要求的处理活动时,同样可以通过传递消息与别的对象联系。因此,程序的执行是靠在对象间传递消息来完成的。 OO方法中对消息的定义是:

消息就是向对象发出的服务请求,它应含有下述信息:提供服务的对象标识、服务标识、输入信息和回答信息。

消息的接收者是提供服务的对象。在设计时,它对外提供的每个服务应规定消息的格式,这种规定称作消息协议。

消息的发送者是要求提供服务的对象或其它系统成分(在不要求完全对象化的语言中允许有不属于任何对象的成分,例如 C++程序的main函数)。在它的每个发送点上需要写出一个完整的消息,其内容包括接收者(对象标识)、服务标识和符合消息协议要求的参数。

消息中只包含发送者的要求,它指示接收者要完成哪些处理,但并不告诉接收者应该怎样完成这些处理。消息完全由接收者解释,接收者独立决定采用什么方式完成所需的处理。一个对象能够接收多个不同形式、内容的消息;相同形式的消息可以送往不同的对象。不同的对象对于形式相同的消息可以有不同的解释,做出不同的反映。对于传来的消息,对象可以返回相应的回答信息,但这种返回并不是必须的,这与子程序的调用/返回有着明显的不同。

消息的形式用消息模式表示,一个消息模式定义了一类消息,它可以对应内容不同的消息。例如,定义“ + an Integer”为实体“3”的一个消息模式,那么“+4”、“+5”等都属于该消息模式的消息。对于同一消息模式的不同消息,同一个对象所做解释和处理都是相同的,只是处理的结果可能不同。对象的固有处理能力按消息分类。

一个消息模式定义对象的一种处理能力。这种处理能力是通过该模式及消息引用表现出来的。所以,只要给出对象的所有消息模式及相应于每一个消息模式的处理能力,也就定义了一个对象的外部特性。消息模式不仅定义了对象所能受理的消息,而且还定义了对象的固有处理能力,它是定义对象接口的唯一信息。使用对象只需了解它的消息模式,所以对象具有极强的黑盒性。 (2)方法

可视为允许作用于该把所有对象分成各种对象类,每个对象类都有一组所谓的方法,它们实际上是类对象上的各种操作。图 7-4给出了对象的分解图。当一个面向对象的程序运行时,一般要做三件事:首先,根据需要创建对象;

10

其次,当程序处理信息或响应来自用户的输入时要从一个对象传递消息到另一对象(或从用户到对象);最后,若不再需要该对象时,应删除它并回收它所占用的存储单元。

由此可见,面向对象的设计方法放弃了传统语言中控制结构的概念,以往的一切控制结构的功能都可以通过对象及其相互间传递消息来实现。

图 7-4对象的分解图

3.类和类层次 (1) 类

在 OO方法中,类的定义是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。具体来说,类由方法和数据集成,它是关于对象性质的描述,包括外部特性和内部实现两个方面。类通过描述消息模式及其相应的处理能力来定义对象的外部特性;通过描述内部状态的表现形式及固有处理能力的实现来定义对象的内部实现,类的形式如图7-5示。

图 7-5类的形式

在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。类的作用是定义对象。比如,程序中给出一个类的说明,然后以静态声明或动态创建等方式定义它的对象实例。 一个类实质上定义的是一种对象类型,它描述了属于该类型的所有对象的性质。例如,Integer 是一个类,它描述了所有整数的性质,5、8和20等这

11

些具体整数都是Integer这个类的对象,都具备算术运算和大小比较的处理能力。

类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。所以,一个对象又称作类的一个实例,而有的文献又把类称作对象的模板。同类对象具有相同的属性与服务,是指它们的定义形式相同,而不是说每个对象的属性值都相同。对象是在执行过程中由其所属的类动态生成的,一个类可以生成多个不同的对象。同一个类的所有对象具有相同的性质,即其外部特性和内部实现都是相同的。一个对象的内部状态只能由其自身来修改,任何别的对象都不能够改变它。因此,同一个类的对象虽然在内部状态的表现形式上相同,但它们可以有不同的内部状态,这些对象并不是完全一模一样的。 ( 2)类层次结构

一个类的上层可以有超类,下层可以有子类,形成一种层次结构。这种层次结构的一个重要特点是继承性,一个类继承其超类的全部描述。这种继承具有传递性,即如果 CI继承CZ,CZ继承C3,则CI(间接)继承C3。所以,一个类实际上继承了层次结构中在其上面的所有类的全部描述。因此,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上面所有类描述的全部特性。

在类的层次结构中,一个类可以有多个子类,也可以有多个超类。因此,一个类可以直接继承多个类,这种继承方式称为多重继承。如果限制一个类至多只能有一个超类,则一个类至多只能直接继承一个类,这种继承方式称为单重或简单继承。在简单继承情况下,类的层次结构为树结构,而多重继承是网状结构。

在 OO方法中,类分为一般类和特殊类。关于它们的定义分别是:如果类A具有类B的全部属性和全部服务,而且具有自己特有的某些属性或服务,则A叫做B的特殊类,B叫做A的一般类。

综上所述,类是对一组对象的抽象,它将该组对象所具有的共同特征(包括属性特征和操作特征)集中起来,由该组对象所共享。在系统构成上,则形成了一个具有特定功能的模块和一种代码共享的手段。 4. 继承性

继承性是自动地共享类、子类和对象中的方法和数据的机制。每个对象都是某个类的实例,一个系统中对象是各自封闭的。如果没有继承性机制,则对象中数据和方法就可能出现大量重复。继承是 OO方法中一个十分重要的概念,并且是OO技术可提高软件开发效率的重要原因之一,其定义是:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。继承意味着自动地拥有,或隐含地复制。就是说,特殊类中不必重新定义已在它的一般类中定义过的属性和服务,它就自动地、隐含地拥有其一般类的所有属性与服务。OO方法的这种特性称作对象的继承性。从一般类和特殊类的定义可以看到,后者对前者的继承在逻辑上是必然的。继承的实现是通过OO系统的继承机制来保证的。

12