对象行为说明课件

上传人:cn****1 文档编号:568617579 上传时间:2024-07-25 格式:PPT 页数:37 大小:141.50KB
返回 下载 相关 举报
对象行为说明课件_第1页
第1页 / 共37页
对象行为说明课件_第2页
第2页 / 共37页
对象行为说明课件_第3页
第3页 / 共37页
对象行为说明课件_第4页
第4页 / 共37页
对象行为说明课件_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《对象行为说明课件》由会员分享,可在线阅读,更多相关《对象行为说明课件(37页珍藏版)》请在金锄头文库上搜索。

1、第八章 对象行为说明$8.1 操作分类 对面向对象的数据库而言,相关的操作可以分为三类: I 对象实例的构造,销毁 II 实例状态的查询 III 实例状态的转换 I 实例构造该类操作属函数操作,将返回一个新的对象实例OID该类操作又可细分为两类:原始构造:通过创建函数创建特定类型的新实例 例: matrix$create(i)一般构造:通过执行某些计算而创建新实例。即新实例是对老实例的运算过程中产生的 例:矩阵对象的转置而产生一个新的转置矩阵 :零件的组装而产生一个新的组件对象实例 :商品的拆分销售产生n个其他商品对象 等等 II 对象状态查询该类操作称为观测函数observer functi

2、on,它返回一个相应对象的内部状态 例. matrix.elem(I,j)-返回一个矩阵中I,j值 Inorigin(vertex)-查询某点是否为原点I, II 类操作均不会造成DB状态的不一致性 III 转换操作 Mutators 该类操作是一个过程,它将按照参数内容改变被激活的对象的内部状态例: 矩阵相加m1.add(m2)III类操作会改变DB的状态,因此,设计该类操作时必须考虑DB的一致性状态的维护问题对象类型可以按状态是否能改变而分为:可转换的对象类型-至少包含一个转换操作不可转换的操作类型$8.2类型相关操作一个类型相关操作的定义分为两部分:操作说明:定义了操作的接口的抽象特征操

3、作定义:提供了操作实现代码操作说明子句opretion的语法结构Opretion declare :- code 在一个对象类型里面唯一的标识了一个操作-不同类型间可以有同名操作指定了参数的数量,相关顺序和类型-参数表可以为空确定了返回结果的类型-若无返回结果,则指定为voidcode为可选部分,它可以对实现部分的代码重新命名。否则,说明部分和实现部分的操作名要一致操作定义子句implementation结构Implementation 操作头部:define“(“”)”is 变量段: 操作体:在declare子句中说明的每一个操作都必须在定义子句中有相应的代码操作头部的名字和变量表必须与说明

4、子句中描述的一致变量段是声明局部变量的名字和类型操作体是程序段,用beginend括起来 Persistent type Vertex is public body x,y,z:float; operations declare translate:Vertex-void; declare scale: Vertex-void; declare rotate: float,char-void; declare distance: Vertex-float; declare inOrigin:-bool; implementation define translate(t)is begin se

5、lf.x:=self.x+t.x; self.y:=self.y+t.y; self.z:=self.z+t.z; end define translate; end type Vertex;类型相关操作的调用类型相关操作只能由该类型的“接受者对象”(receiver object)来调用接受者对象与操作名间用”.”来分隔执行时,由变量引用(或复引用)的对象实例作为接受者对象来激活由“.”引用的操作例 var myVertex: Vertex; translationVertex: Vertex; myVertex.translate(translationVertex);操作调用的约束及se

6、lf概念接受者类型(receiverType):接受者对象的类型在对象系统中,一个类型相关操作只能被该类型的对象实例所调用 即.接受者类型应与定义该操作的类型相同在操作定义子句,代码实现部分,接受者对象由self来引用Self可看作为隐式的定义参数-为所有操作的接受者类型参数 例:mycuboid.v1.translate(translationVertex);自底向上的类型定义OO建摸中,一般而言总是自底向上构造应用领域在对象类型系统中最低层的类型首先被定义由底向上的逐层定义类型.在定义过程中,尽量利用底层类型的结构和操作构造上层的类型Persistent type Cuboid is pu

7、blic body v1,v2,v3,v4,v5,v6,v7,v8:Vertex; mat:Material;value:float;Operations declare length:-float; declare width:-float; declare height:-float; declare volume:-float; declare weight:-float; declare translate:Vertex-void code translateVertexCode; declare scale: Vertex-void code scaleCube; declare r

8、otate:float,char-void !rotation angle and axis as parameters code rotateCube; Implementation define length is return self.v1.distance(self.v2)!delegate the computation to vertex v1 define width is return self.v1.distance(self.v4); define height is return self.v1.distance(self.v5); define volume is r

9、eturn self.length*self.width*self.height; define weight is return self.volume*self.mat.specWeight; define translateVertexCode(t) is begin self.v1.translate(t);! Delegate translate to the Vertex instance v1 self.v8.translate(t);! Delegate translate to the Vertex instance v8 end define translateVertex

10、Code; End type Cuboid $8.4 对象封装 Encapsulation对象封装可以做到信息隐藏对象状态的转换只能通过调用在public子句中可见的操作来操纵为了保证对象状态转换的一致性,必须对所有的转换操作进行必要的封装。将可能造成不一致的转换操作私有化,或者,将其增加了维护状态一致性的操作后再放到public序列中。示例:一个cuboid对象实例的转换隐藏一个cuboid对象实例进行平移时,其一致性约束是8个点对象进行同步转换。而如下的操作则破坏了同步,造成状态不一致且无法检查 var myStrangeCuboid : Cuboid; myStrangeCuboid.c

11、reate; !initialization of the bounding vertices to form a unit cube(1)myStrangeCuboid.v1.x:=0.5;(2)myStrangeCuboid.v1.y:=0.5;(3)myStrangeCuboid.v1.z:=0.5;通过封装控制不一致性的出现 persistent type Cuboid is public length,width,height,volume,weight,translate,scale,rotate body operations implementation end type Cu

12、boid;类型相关操作包含如下几类操作内嵌操作 Build_in operations不需用户定义,由系统提供的操作用户定义操作 user_defined operations 既在operations段声明,并在implemented 段实现的函数内部操作 inner operations: 包含了内嵌和用户定义的操作全集外部操作 outer operations:出现在public子句中的操作,其为内部操作的子集内部操作集中,所有操作只能在self所指定的接受者对象上被激活O-O对象类型与关系类型在一致性控制的区别关系模型:不存在嵌套关系,因此,它的 一致性控制是事务级的,更难控 制.关系

13、中关联对象间通过外键连 接,更容易出现不一致O-O模型:通过对象封装来控制。$8.5初始化 Initialization一个对象的实例化过程为:调用内嵌的初始化操作初始化一个空对象对其每个对象实例化采用自底向上逐层赋值法建立实例缺陷如下:违背封装 自底向上逐层赋值容易产生不一致状态初始化的赋值过程是在外部显式进行-构成一个长事务(尤其当有一个长引用连时)初始化子的构造GOM提供一个组合初始化操作初始化子初始化子的名字与类型相同初始化子的说明和定义同外部操作定义方法一致初始化子将空对象的初始化和对象的赋值组合在一起当赋值中存在共享子对象时,则将共享对象实例用参数引入将无共享的引用链上所有对象的初

14、始化和实例化操作全部包在最高层的类型初始化子中编译器在处理初始化子时做两件事 1.初始化一个新对象的空壳 2.激活初始化子进行实例化若初始化子需要变元,则通过引用create操作来传递Persistent type Cuboid is public body operations declare Cuboid:Material-void; implementation define Cuboid(m) is begin ! Generate the unit cube made of m self.mat:=m; self.v1.create; self.v1.x:=0.0; self.v1.

15、y:=0.0; ! V1=(0,0,0) self.v1.z:=0.0; self.v2.create; ! v2=(1,0,0) self.v8.create; self.v8.x:=0.0; self.v8.y:=1.0; ! v8=(0,1,1) self.v8.z:=1.0; End define Cuboid;End type Cuboid; Var myCuboid :Cuboid; gold:Material; myCuboid.create(gold)$4.6 用删除函数优化delete操作在删除对象操作时,应当考虑防止垃圾对象的出现组合删除操作的构造要点当删除上层对象实例时,

16、其单独引用的下层对象应当一起删除,其方法与初始化子相同既整个引用链上的下层对象实例均在最高层的删除子中删除。对引用的共享子对象不能一起删除,具体做法交由系统处理删除子的名字与初始化子相同,加上一个以示区别$4.7 重载 Overloading重载:提供了在同一个名字空间下,语义相关但操作内容不同的操作名的重用 例:单位立方体和长方体可以共用一个类 型, 需要两个初始化子; 单位立方体不需要长度参数,而长方 体需要长,宽,高作为参数; 此时利用重载概念解决问题定义重载的规则必须在同一名字空间下(同一个对象类型条件)被重载的操作必须至少能用下面的规则之一来区分:参数个数参数类型对任何类型相关操作,

17、都可以使用重载提高灵活性Persistent type Cuboid is operations declare Cuboid :Material-void code CuboidMatCode; declare Cuboid:Material,float,float-void code CuboidMatScaleCode; implementation define CuboidMatCode(m) is ! As before define CuboidMatScaleCode(m,scaleLength,scaleWidth,scaleHeight) is begin self.mat

18、:=m; self.v1.create ! Generate the cuboid of specified dimension self.v1.x :=0.0; self.v1.y :=0.0; ! V1 = (0,0,0) self.v1.z :=0.0; self.v2.create; ! V2=(scaleWidth,0,0) self.v8.create; self.v8.x :=0.0; ! V8=(0,scaleLength,scaleHeight) self.v8.y :=scaleLength; self.v8.z :=scaleHeight; end define Cubo

19、idMatScaleCode; End type Coboid 8.8 值接受VCOs和值返回VTOsGOM针对对象状态的读、写分别定义了二个操作VCOs和VTOsGOM提出了内嵌的VCOs和VTOs:declare value:float; (VTO)读declare value:float; (VCO)写myCuboid.value := yourCuboid.value等价于myCuboid.value(yourCuboid.value);用户定义VCOs用户需要对对象属性的状态读写进行控制用户可以通过某种操作结果的写入来改变对象属性的状态,例如圆对象,其属性为半径,可以定义一个操作ci

20、rcumference,将圆周长为参数来计算一个半径值,并用VCO操作将结果写入,以改变属性状态。*程序请参考教材214页利用VCOs和VTOs可以在public子句中标示属性和操作的读、写性质:缺省:表示该属性(操作)可读写只有value:只读一般不会有只写,因为查询是必须的操作8.9 关于自由操作free和操作子定义自由操作:用户在类型框架外而定义的操作自由操作的说明子句与实现子句格式与类型相关操作格式相似例:求两点距离用两个点作参数的自由操作Persistent declare distance: Vertex, Vertex float 自由操作名 操作参数表 结果类型Code Fre

21、eDistanceCode;Define FreeDistanceCode(p,q) isreturn p.distance(q);自由操作的实现最终是调用类型相关操作来构建自由操作的特点自由操作不是同名的类型相关操作的重载原因:名字空间不同自由操作提供了操作定义的灵活性,如上例的距离计算原因:类型相关操作必须有一个隐含的 接受参数self自由操作可以在类型间构造与多个类型相联系的各种操作,又不希望一定要指明一个受体,提供了更大的灵活性利用自由操作在类型框架外定义操作应当允许(或者限制初学者)在类型框架外定义新操作以保护类型的安全方法:利用自由操作子来实现,但与纯自由操作的区别在于这类操作仍然

22、属于类型相关,即有一个接受类型。特点:由于自由操作本身无类型限制,因此,必须将接受类型显式说明,并用 | 和参数表隔离例:计算一个立方体的镜像mirror操作将一个立方体旋转到一个面(由三个点 作参数)的反射位置。(转换操作)persistent declare mirror:cuboid|vertex,vertex,vertexvoiddefine mirror(v1,v2,v3) isbegin self.rotate(); end define mirror;该类型操作所引用的类型相关操作只能是public子句中声明的操作目的:为了确保对象状态的一致性操作符的重载利用重载概念,可以对操作

23、符,=,+,-,进行重定义原来,操作符是简单类型,语义确定现在,可以对复杂对象间的操作语义进行重新定义例如,立方体11000II.从立方体集合中,选择体积大的立方体,volum1000为了能构造一个通用的select,显然,选择为此应当作为操作参数操作子作为参数的实现方法在操作说明子句中,参数表中操作子(选择谓词)的位置用 标识 内仅对该操作子(选择谓词)的参数进行说明,不需要说明操作子名在操作实现子句define时,用一个虚名表达操作子来占位在引用时则用一个预先定义好的操作子(选择谓词)代真declare selectCuboids: CuboidSet,Cuboid|bool,Cuboid

24、Setvoid;define selectCuboids(allCuboids,selPred,selectedCuboids) isvar candidate:Cuboid;beginselectedCuboids:=;foreach(candidate in allCuboids)if(candidate.selPred) selectedCuboids.insert(candidate);end;declare isExpensiveCuboid:Cuboid | bool;declare isLargeCuboid:Cuboid| bool;define isExpensiveCuboid isreturn self.value 500.0;define isLargeCuboid isreturn self.volume 100.0;var myCuboids:CuboidSet; largeOrExpensive:CuboidSet; largeOrExpensive.create; selectCuboids(myCuboids,isLargeCuboid, largeOrExpensive); selectCuboids(myCuboids, isExpensiveCuboid, largeOrExpensive);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号