




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章 对象行为阐明 $8.1 操作分类 对面向对象的数据库而言,相关的操作可以分为三类: I 对象实例的构造,销毁 II 实例形状的查询 III 实例形状的转换 I 实例构造 该类操作属函数操作,将前往一个新的对象实例OID 该类操作又可细分为两类: 原始构造:经过创建函数创建特定类型的新实例 例: matrix$create(i) 普通构造:经过执行某些计算而创建新实例。即新实例是对老实例的运算过程中产生的 例:矩阵对象的转置而产生一个新的转置矩阵 :零件的组装而产生一个新的组件对象实例 :商品的拆分销售产生n个其他商品对象 等等 II 对象形状查询 该类操作称为观测函数observer
2、function,它前往一个相应对象的内部形状 例. 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 在一个对象类型里面独一的标识了一个操作-不同类型间可以有同名操作 指定了参数的数量,相关顺序和类型-参数表可以为空 确定了前往结果的类型-假设无前往结果,那么指定为void code为可选部分,它可以对实现部分的代码重新命名。否那么,阐明部分和实现部分的操作名要一致操作定义子句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 defin
5、e translate(t)is begin self.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(transl
6、ationVertex);操作调用的约束及self概念 接受者类型receiverType):接受者对象的类型 在对象系统中,一个类型相关操作只能被该类型的对象实例所调用 即.接受者类型应与定义该操作的类型一样 在操作定义子句,代码实现部分,接受者对象由self来援用 Self可看作为隐式的定义参数-为一切操作的接受者类型参数 例:mycuboid.v1.translate(translationVertex);自底向上的类型定义 OO建摸中,普通而言总是自底向上构造运用领域 在对象类型系统中最低层的类型首先被定义 由底向上的逐层定义类型.在定义过程中,尽量利用底层类型的构造和操作构造上层的类
7、型Persistent type Cuboid is public 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-v
8、oid code scaleCube; declare rotate: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
9、(self.v5); define volume is return 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
10、v8 end define translateVertexCode; End type Cuboid $8.4 对象封装 Encapsulation 对象封装可以做到信息隐藏 对象形状的转换只能经过调用在public子句中可见的操作来支配 为了保证对象形状转换的一致性,必需对一切的转换操作进展必要的封装。将能够呵斥不一致的转换操作私有化,或者,将其添加了维护形状一致性的操作后再放到public序列中。例如:一个cuboid对象实例的转换隐藏一个cuboid对象实例进展平移时,其一致性约束是8个点对象进展同步转换。而如下的操作那么破坏了同步,呵斥形状不一致且无法检查 var myStrangeC
11、uboid : Cuboid; myStrangeCuboid.create; !initialization of the bounding vertices to form a unit cubemyStrangeCuboid.v1.x:=0.5;myStrangeCuboid.v1.y:=0.5;myStrangeCuboid.v1.z:=0.5;经过封装控制不一致性的出现 persistent type Cuboid is public length,width,height,volume,weight,translate,scale,rotate body operations im
12、plementation end type Cuboid;类型相关操作包含如下几类操作 内嵌操作 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.
15、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 用删除函数优化dele
16、te操作 在删除对象操作时,该当思索防止渣滓对象的出现 组合删除操作的构造要点 当删除上层对象实例时,其单独援用的下层对象该当一同删除,其方法与初始化子一样既整个援用链上的下层对象实例均在最高层的删除子中删除。 对援用的共享子对象不能一同删除,详细做法交由系统处置 删除子的名字与初始化子一样,加上一个以示区别$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 CuboidMatScaleC
18、ode(m,scaleLength,scaleWidth,scaleHeight) is begin self.mat:=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.v
19、8.y :=scaleLength; self.v8.z :=scaleHeight; end define CuboidMatScaleCode; End type Coboid 8.8 值接受VCOs和值前往VTOs GOM针对对象形状的读、写分别定义了二个操作VCOs和VTOs GOM提出了内嵌的VCOs和VTOs:declare value:float; (VTO)读declare value:float; (VCO)写 myCuboid.value := yourCuboid.value等价于myCuboid.value(yourCuboid.value);用户定义VCOs 用户需求
20、对对象属性的形状读写进展控制 用户可以经过某种操作结果的写入来改动对象属性的形状,例如圆对象,其属性为半径,可以定义一个操作circumference,将圆周长为参数来计算一个半径值,并用VCO操作将结果写入,以改动属性形状。*程序请参考教材214页 利用VCOs和VTOs可以在public子句中标示属性和操作的读、写性质:缺省:表示该属性(操作)可读写只需value:只读普通不会有只写,由于查询是必需的操作8.9 关于自在操作free和操作子定义 自在操作:用户在类型框架外而定义的操作 自在操作的阐明子句与实现子句格式与类型相关操作格式类似 例:求两点间隔用两个点作参数的自在操作 Persi
21、stent declare distance: Vertex, Vertex float 自在操作名 操作参数表 结果类型Code FreeDistanceCode; 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子句中声明的操作目的:为了确保对象形状的一致性操作符的重载 利用重载概念,可以对操作符,=,+,-,进展重定义 原来,操作符是简单类型,语义确定 如今,可以对复杂对象间的操作语义进展重新定义例如,立方体11000 从立方体集合中,选择体积大的立方体,volum1000为了能构造一个通用的select,显然,选择为此该当作为操作参数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业日常行政工作流程标准
- 共赢环保合作倡议书3篇
- 2025年病案编码竞赛试题及答案
- 2025年丙肝防治培训试题及答案
- 核算会计笔试题目及答案
- 办公设备采购清单及配置建议
- 在2025年县领导干部素质提升专题辅导讲座暨县委理论学习中心组学习(扩大)会议上的讲话
- 山东省青岛第十九中学2025届高三上学期期中考试地理试卷(含答案)
- 一场意外的冒险事件记叙文8篇范文
- 2025吉林省矿业集团有限责任公司遴选31人考前自测高频考点模拟试题完整答案详解
- 2025-2026学年七年级英语上学期第一次月考 (上海专用)原卷
- 2025年电梯培训考核题目及答案
- VTE课件讲解教学课件
- 2024人教版七年级英语上册 Unit7课时4SectionB(1a-1d)分层作业(含答案)
- 高原性肺水肿
- 2025年教科版小学三年级上册《科学》第三单元第2课认识气温计课件
- 平面直角坐标系 课件 2025-2026学年北师大版数学八年级上册
- 2025-2026学年北师大版(2024)小学数学二年级上册教学计划及进度表
- 工程造价软件应用 课件 第2章 广联达BIM土建计量平台应用
- 2025成人高等学校专升本招生统一考试政治试题及答案解析
- 车间顶防火改造方案(3篇)
评论
0/150
提交评论