资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第八章 对象行为说明 $8.1 操作分类 对面向对象的数据库而言,相关的操作可 以分为三类: I 对象实例的构造,销毁 II 实例状态的查询 III 实例状态的转换 I 实例构造 该类操作属函数操作,将返回一个新的对象实例 OID 该类操作又可细分为两类: 原始构造:通过创建函数创建特定类型的 新实例 例: matrix$create(i) 一般构造:通过执行某些计算而创建新实 例。即新实例是对老实例的运算过程中产生的例:矩阵对象的转置而产生一个新的转置矩阵:零件的组装而产生一个新的组件对象实例:商品的拆分销售产生n个其他商品对象 等等 II 对象状态查询 该类操作称为观测函数observer function, 它返回一个相应对象的内部状态 例. matrix.elem(I,j)-返回一个矩阵中I,j值 Inorigin(vertex)-查询某点是否为原点 I, II 类操作均不会造成DB状态的不一致 性 III 转换操作 Mutators 该类操作是一个过程,它将按照参数内容 改变被激活的对象的内部状态 例: 矩阵相加m1.add(m2) III类操作会改变DB的状态,因此,设计该 类操作时必须考虑DB的一致性状态的维护 问题 对象类型可以按状态是否能改变而分为: 可转换的对象类型-至少包含一个 转换操作 不可转换的操作类型$8.2类型相关操作 一个类型相关操作的定义分为两部分: 操作说明:定义了操作的接口的抽 象特征 操作定义:提供了操作实现代码操作说明子句opretion的语法结构 Opretiondeclare :-code 在一个对象类型里面唯一的标识了一 个操作-不同类型间可以有同名操作 指定了参数的数量,相关顺序和类 型-参数表可以为空 确定了返回结果的类型-若无返回结果, 则指定为void code为可选部分,它可以对实现部分的代 码重新命名。否则,说明部分和实现部分的操作名要一致操作定义子句implementation结构 Implementation 操作头部: define“(“”)”is变量段:操作体: 在declare子句中说明的每一个操作都必须在定义 子句中有相应的代码 操作头部的名字和变量表必须与说明子句中描述 的一致 变量段是声明局部变量的名字和类型 操作体是程序段,用beginend括起来 Persistent type Vertex ispublicbody x,y,z:float;operationsdeclare translate:Vertex-void;declare scale: Vertex-void;declare rotate: float,char-void;declare distance: Vertex-float;declare inOrigin:-bool;implementationdefine translate(t)isbeginself.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);操作调用的约束及self概念 接受者类型(receiverType):接受者对象的类型 在对象系统中,一个类型相关操作只能被该类型 的对象实例所调用即.接受者类型应与定义该操作的类型相同 在操作定义子句,代码实现部分,接受者对象由 self来引用 Self可看作为隐式的定义参数-为所有操作的接 受者类型参数例:mycuboid.v1.translate(translationVertex);自底向上的类型定义 OO建摸中,一般而言总是自底向上构造 应用领域 在对象类型系统中最低层的类型首先被定 义 由底向上的逐层定义类型.在定义过程中, 尽量利用底层类型的结构和操作构造上层 的类型Persistent type Cuboid ispublic body v1,v2,v3,v4,v5,v6,v7,v8:Vertex;mat:Material;value:float; Operationsdeclare length:-float;declare width:-float;declare height:-float;declare volume:-float;declare weight:-float;declare translate:Vertex-voidcode translateVertexCode;declare scale: Vertex-voidcode scaleCube;declare rotate:float,char-void !rotation angle and axis as parameterscode rotateCube;Implementationdefine length isreturn self.v1.distance(self.v2)!delegate the computation to vertex v1 define width isreturn self.v1.distance(self.v4);define height isreturn self.v1.distance(self.v5);define volume isreturn self.length*self.width*self.height;define weight isreturn self.volume*self.mat.specWeight;define translateVertexCode(t) isbeginself.v1.translate(t);! Delegate translate to the Vertex instance v1self.v8.translate(t);! Delegate translate to the Vertex instance v8end define translateVertexCode; End type Cuboid $8.4 对象封装 Encapsulation 对象封装可以做到信息隐藏 对象状态的转换只能通过调用在public子句 中可见的操作来操纵 为了保证对象状态转换的一致性,必须对 所有的转换操作进行必要的封装。将可能 造成不一致的转换操作私有化,或者,将 其增加了维护状态一致性的操作后再放到 public序列中。示例:一个cuboid对象实例的转换 隐藏 一个cuboid对象实例进行平移时,其一致性约束 是8个点对象进行同步转换。而如下的操作则破坏 了同步,造成状态不一致且无法检查var myStrangeCuboid : Cuboid;myStrangeCuboid.create;!initialization of the bounding vertices to form a unit cube myStrangeCuboid.v1.x:=0.5; myStrangeCuboid.v1.y:=0.5; myStrangeCuboid.v1.z:=0.5;通过封装控制不一致性的出现persistent type Cuboid ispublic length,width,height,volume,weight,translate,scale,rotatebodyoperationsimplementationend type Cuboid;类型相关操作包含如下几类操作 内嵌操作 Build_in operations 不需用户定义,由系统提供的操作 用户定义操作 user_defined operations 既在operations段声明,并在implemented段实现的函数 内部操作 inner operations: 包含了内嵌和用户定 义的操作全集 外部操作 outer operations:出现在public子句中的 操作,其为内部操作的子集 内部操作集中,所有操作只能在self所指定的接受 者对象上被激活O-O对象类型与关系类型在一致性 控制的区别 关系模型:不存在嵌套关系,因此,它的 一致性控制是事务级的,更难控制.关系中关联对象间通过外键连 接,更容易出现不一致 O-O模型:通过对象封装来控制。$8.5初始化 Initialization 一个对象的实例化过程为: 调用内嵌的初始化操作初始化一个 空对象 对其每个对象实例化 采用自底向上逐层赋值法建立实例 缺陷如下: 违背封装 自底向上逐层赋值容易 产生不一致状态 初始化的赋值过程是在外部显式进 行-构成一个长事务(尤其当有一个长 引用连时)初始化子的构造 GOM提供一个组合初始化操作初始化子 初始化子的名字与类型相同 初始化子的说明和定义同外部操作定义方 法一致 初始化子将空对象的初始化和对象的赋值 组合在一起 当赋值中存在共享子对象时,则将共享对 象实例用参数引入 将无共享的引用链上所有对象的初始化和 实例化操作全部包在最高层的类型初始化子中 编译器在处理初始化子时做两件事 1.初始化一个新对象的空壳2.激活初始化子进行实例化 若初始化子需要变元,则通过引用create 操作来传递Persistent type Cuboid ispublic body operationsdeclare Cuboid:Material-void;implementationdefine Cuboid(m) isbegin ! Generate the unit cube made of mself.mat:=m;self.v1.create;self.v1.x:=0.0;self.v1.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操作 在删除对象操作时,应当考虑防止垃圾对象的出 现 组合删除操作的构造要点 当删除上层对象实例时,其单独引用的下 层对象应当一起删除,其方法与初始化子相同既 整个引用链上的下层对象实例均在最高层的删除 子中删除。 对引用的共享子对象不能一起删除,具体 做法交由系统处理 删除子的名字与初始化子相同,加上一个 以示区别$4.7 重载 Overloa
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号