55
1 第三章 类型与对象 Related to text book Chp. 7 (English book)

第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

  • Upload
    others

  • View
    18

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

1

第三章 类型与对象

Related to text book Chp. 7 (English book)

Page 2: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

2

• 对象与值

• 对象类型

• 基于元组的对象类型

• 实例

• 对象标识符

• 引用

• 对象类型扩展

• etc

目录

Page 3: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

3

类型与对象

• 基于Generic对象模型(GOM)• 类型系统(sort type)的发展

– 类型:<类型名,{值域},{操作}>– 早期语言只提供简单类型

– 进一步复杂类型简单类型、结构类型、串、指针...

– Ada提出抽象数据类型ADT(abstract data type)

• 用户自己定义结构、操作

• 系统提供打包功能

• 以类型方式提供使用

Page 4: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

4

几种简单sort类型

Page 5: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

5

类型-续

• 变量说明:指明一个变量的类型

• 变量赋值:类型的实例化操作

– 实例化结果:指定一个值

– 在实例的整个生命周期,值是不变的,因此类型的实例无需标识,值就是其本身的标识

– 变量的重新赋值是重新实例化过程,原实例已消亡。

• 类型系统的问题:无法描述实例的状态变化,即不同的值代表了某个实例在不同时刻的不同状态

Page 6: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

6

面向对象类型

• 对象系统强调的是对象状态的变化

• 对象生命周期中的某一瞬间是一个状态

(对象属性的某个值集)

• 当对象属性值被修改时,表明该对象由一

个状态转化为另一个状态

Page 7: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

7

面向对象类型-续

• 为了能识别不同状态下的对象,必须进行

标识 ——唯一性约束

• 对象状态转化时内部变化必须合理,因此

需要进行封装——完整性约束

• 对象O由(id#, Type, Rep)三元组表示

Page 8: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

8

GOM对象类型框架定义

• 对象类型名唯一

• Public子句提供外部说明

• Body子句描述结构主体

• 操作子句描述接口说明

– 操作名(唯一性)

– 参数说明

• 操作实现子句——描述

操作体

Page 9: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

9

对象结构

• 结构主体由三种基本结构及其组合而

–元组结构(tupe_structure)

–集合结构(set_structure)

–列表结构(list_structure)

Page 10: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

10

元组结构定义

Typei 可以是

• 简单sort;

组合sort;

• 对象类型;混合类

型;集合类型;表类

型;直接递归类型等

Page 11: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

11

内嵌的属性值读写操作

• VCO操作(Value receiving operation)– 值接收操作

– Declare attri: → type i; – 读取当前第i个属性状态

• VTO操作(Value returning operation)– 值返回操作

– Declare attri: ← type i; – 将类型为Type i的状态写入第i个属性中

Page 12: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

12

举例

• 直接递归示例

• 维护person的对象实例状态的操作

Var p:person…p.age:=p.age+1 p.age (p.age+1)

Page 13: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

13立方体对象模型的定义

• 定义“顶点”的对象类型 • 定义立方体的对象类型

• 定义原材料的对象类型

Page 14: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

14

类型的实例化

• 一个对象类型框架可产生一系列对象实例

• 内嵌的创建对象操作——“create”

• GOM类型的实例化过程

– 第一步 说明对象变量

Var myCuboid :Cuboid;

– 第二步 执行赋值语句:

myCuboid:=Cuboid$create;

或 myCuboid.create;

Page 15: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

15

赋值语句的作用

(1)产生了一个初始化的空壳实例;

(2)对该空壳实例赋予一个对象标记OID;

(3)将OID(或实例地址)赋给变量myCuboid;(4)将空壳属性值初始化为:

Int:0;float:0.0;char:’\0’;bool:false;复杂对象类型:NULL;

(5)当前该OID还仅是逻辑表示,不能被用户访问。

*产生了一个仅仅与OID相联系的一个空对象。

-第三步:对空对象的每个属性进行实际值

的初始化工作

Page 16: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

16

图7.2 The Topological Representation Of a Cuboid

图7.3 The “Skeleton” of a New Cuboid Instance

y

x

V4

V8

V1

V3

V6

V7

V2

V5

myCuboid

mat:NULLvalue:0.0v1:NULLv2:NULLv3:NULLv4:NULLv5:NULLv6:NULLv7:NULLv8:NULL

id1 Cuboid

Page 17: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

17

对象标识

标识对象的三种方法:

– 内容标识—关键字标识符

– 地址标识—物理对象标识符

– 逻辑对象标识符

Page 18: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

18

内容标识

• 内容标识的问题(内容依赖)

– 概念的混淆:将两对象相等与两对象内容相等混为一谈。

– 一致性管理的困难。

例1:大商场中,同一商品在不同柜组有不同售价,商品的主key为(商品号+柜组号)。

例2:若主key为(人名+地址),当搬家而修改

库时,给完整性维护带来困难。

Page 19: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

19

地址标识

• 地址标识

– 用对象分配的地址空间表示对象。

• 地址标识问题(地址依赖)

– 存储空间的重用导致引用错误且无法查找。

例如新对象占用已删除对象空间。

– 分布式系统中对象经常被移动位置。

– DB性能调整时常常需要重构硬盘存储区。

Page 20: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

20

逻辑对象标识符 OID

• 对于GOM,每个对象可以描述为下述三

元组

O = (id#,Type,Rep)– Id# :系统产生的对象O的逻辑标识符

– Type:对象O的类型

– Rep:对象的内部状态,即属性的当前值。

Page 21: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

21

OID的特点

• 对象实例初始化时,系统产生一个唯一的

OID

• 一个对象的OID在整个生命周期都永远保

• 当对象删除后,其OID值永不复用

• 对象的存储位置与OID值有唯一的映射

Page 22: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

22

共享子对象

• 标准的RDBMS:由于INF约束,不支持对象的引用

• 扩展的INF2的RDBMS,只能支持层次结构,不支持

网状结构

• 从需求而言,复杂DB应用要求支持网络结构

• O-O模型中,一个对象模型可以不受限制地引用其他

对象,同时也可以被其他对象引用--构造出网状

拓扑结构

• GOM模型通过多对象共享机制,支持网络结构应用

Page 23: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

23

共享子对象例子

Page 24: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

24

共享子对象的副作用

• 对象的状态变化会被其他引用对象可见

• 例:一个对Material对象的修改:

anotherCuboid.mat.name = ”Copper”;

anotherCuboid.mat.SpecWeight = 0.90

• 会被myCuboid所指id1可见

Page 25: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

25

Referencing

• 复制(copy)语义:将一个值真实地复制到一

个sort类型的变量或属性中;

• 引用(referencing)语义:赋值语句处理的是

一个对象时,只将该对象的OID赋值到相应的

变量或属性中;

• 引用语句与C中的指针赋值相似,是一个间址

操作。

Page 26: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

26

Dereferencing

• Dereferencing语义:引用语义沿着引用链

的传递。

• Dereferencing语义是通过“•”操作符的重

载,构造的引用链实现

• 整个对象结构可以通过引用语义构成一个

网状结构

• 一个引用查找的实现是沿着引用链,导航

式地对逐个对象实例的查询

Page 27: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

27

Var someMaterial:Material;w:float;muCuboid:Cuboid;…

(1)someMaterial.create;(2)someMaterial.name:=“Carbon”;(3)someMaterial.specWeight:=0.75;(4)myCuboid.mat:=someMaterial;(5)w:=myCuboid.mat.specWeight;

mat:id88value:39.99v1:id11…

name:”Carbon”specWeight:0.75…

id88

id1Cuboid

myCuboid

Material

someMaterial

Page 28: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

28

聚合类型 collection

• GOM模型提供body二种内嵌的聚合类型

的类型构造子:

– 集合(set)结构

– 列表(list)结构

Page 29: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

29

集合结构的对象类型

• 集合结构的对象类型是一个集合对象

表达如下:

Type set typeName ispublic …body {Element type}…end

• 集合元素类型 Element Type 可以是 sort 类型,也可以是对象类型,或用户定义类型

Page 30: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

30

type SetTypeName isPublic…body

{Element Type}…

end type SetTypeName;

type TelephoneNumbers is{int};

type TelephoneNumbers isPublic…body

{int}operations

…implementation

…end type TelephoneNumbers;

声明一个变量并赋值

var guidosTelephoneNumbers: TelephoneNumbers;…

(1) guidosTelephoneNumbers.create;(2) guidosTelephoneNumbers.insert(6082080);(3) guidosTelephoneNumbers.insert(28833);

Page 31: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

31

声明一个变量

var theGOM24HourSupportHotLine : guidosTelephoneNumbers;…

theGOM24HourSupportHotLine := guidosTelephoneNumbers;theGOM24HourSupportHotLine.insert (6083968);

{6082080,6083968,28833}

TelephoneNumbersid4711

guidosTelephoneNumbers theGOM24HourSupportHotLine

Fig. 7.7 Object Base Extension with a Shared Set Object

Page 32: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

32

var workPieceCuboids:CuboidSet;valuableCuboids:CuboidSet;…

workPieceCuboids.insert(myCuboid);…

valuableCuboids.insert(…);

type CuboidSet is{Cuboid};

…end type Cuboid;

type SetTypeName isPublic…body

{ElementType}…

end type SetTypeName;

集合结构的类型也可以是复杂类型

Page 33: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

33

集合结构的对象类型特点

• 需要定义一个元素(Element)的类型

• 集合对象类型本身可以用于定义对象属性的类型

• 集合对象类型支持数学上的Set概念,即不允许有相同元素存在。(GOM要作唯一性

检查)

• 当Element是sort类型时,插入概念是复制语义(插入值);

Page 34: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

34

集合结构的对象类型特点-续

• 当Element是对象类型时,插入概念是引用语义(插入OID);

• 集合对象允许共享,当有共享发生时,为共享子对象。

• 共享概念的引入,使集合对象的概念可以作为对象库概念。

• 共享的副作用 — 修改可见

Page 35: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

35

CuboidSetid59

workPiece Cuboids

{id1,id2,id3} {id3}

name:”Iron”specWeight:0.89

name:”Gold”specWeight:1.32

valuable Cuboids

id60 CuboidSet

id77id99

Cuboid

Material

Vertex

id1

mat: id77value:39.99v1:id11 v2:id12v3:id13 v4:id14v5:id15 v6:id16v7:id17 v8:id18

id11x: 0.0y: 0.0z: 0.0

id3

mat: id99value:89.90v1:id31 v2:id32v3:id33 v4:id34v5:id35 v6:id36v7:id37 v8:id38

id2

mat: id77value:19.95v1:id21 v2:id22v3:id23 v4:id24v5:id25 v6:id26v7:id27 v8:id28

id18x: 0.0y: 1.0z: 1.0

id21x: 0.0y: 0.0z: 0.0

id28x: 0.0y: 2.0z: 2.0

id31x: 0.0y: 0.0z: 0.0

id38x: 0.0y: 3.0z: 3.0

… … …

Page 36: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

36

对象类型的扩展

• GOM通过with extension子句隐式地产生并维护一个特定对象类型的集合对象类型,用以管理该类型实例化的对象集合。

• 例 type Cuboidwith extention is…end type Cuboid

系统自动产生一个set Cuboid对象类型Cuboids。并将所有Cuboid的实例化对象自动插入到Cuboids中。

• Cuboids类型只允许用户使用ext (Cuboid)进行访问。

• 不允许任何显式地删除、插入等操作

• 利用扩展概念建立对象实例库

Page 37: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

37

列表结构对象类型

• 列表结构对象类型的特点– 列表中的元素是有序的

– 列表的数学概念是bag,即允许相同的元素在表中不同位置多次出现

– 列表中元素的类型可以是sort type或object type

• 表结构对象类型的定义方式type Name ispublic …body <Element type>…

Page 38: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

38

mat: id77value: 250.00vertices: id899

id299 Cuboid2

<id111,id112,id113,id114,id115,id116,id117,id118>id899 VertexList

type VertexList isPublic…body

<vertex>operations

…implementation

…end type VertexList;

type Cuboid2 isPublic…body [mat: Material;

value: float;vertices:VertexList;]

operations…

implementation…

end type Cuboid2;

Page 39: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

39

类型安全

• 非类型安全数据类型:数据库的组成(属性,变量,集合元素等),并不限制为一个特定的类型(不需要类型说明),即编译时不对它们进行类型检查,好处是使用灵活。

• 问题:大量的错误只能在运行时被检测出来

Page 40: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

40

类型安全-续

• 类型安全数据类型:对所有构件均限制了数据类型。

– 强类型语言

– GOM为强类型

• 优点

– 类型安全

– 高效,在运行时无需作类型检查。

– 支持结构化设计

– 类型约束的组件为:属性、变量、操作参数、表和集合类型的元素。

– 强类型语言编译时检查表达式中类型的兼容性。

Page 41: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

41

type City isPublic…body [name: string;

mayor: Person;inhabitants: PersonSet;]

operations…

implementation…

end type City;

type Person isPublic…body

[name: string;age: int;spouse:Person;livesIn: City;]

operations…

implementation…

end type Person;type PersonSet is

Public…body {Person}operations

…implementation

…end type PersonSet;

Var cityOfLA: City;mickey,mini,donald;Person;

Page 42: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

42

name: “Los Angeles”mayor: id188inhabitants: id115

id571City

cityOfLA

{id193,id188,id372}id115

PersonSet

name: “Mickey Mouse”age: 60spouse: id372livesIn: id571

Personid188

name: “Mini Mouse”age: 50spouse: id188livesIn: id571

Personid372

name: “Donald Duck”age: 45spouse: NULLlivesIn: id571

Personid193

donaldmickeyFig7.11 Person和City 的对象库

Page 43: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

43

vartotalAge,ageOfSomeBody:int;anyBody:Person;name:string;…

(1) ageOfSomeBody:=cityOfLA.mayor.spouse.age;

(2) foreach(anyBody in cityOfLA.inhabitants)totalAge:=totalAge+anyBody.age;

foreach(anyBody in cityOfLA.inhabitants)totalAge:=totalAge+anyBody.age;

ageOfSomeBody:=cityOfLA. mayor. spouse. age;

intCity

PersonPerson

int

int

Person City

PersonSet

int int Person

Page 44: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

44

持久性

• 持久性Persistence :当程序的执行终止

后,其创建的构件和数据仍然存在

• GOM中持久化构件

– 对象类型

– 对象实例

– 变量

Page 45: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

45

类型的持久化

• 类型的持久性由Persistence定义符说明

– 例:Persistence Type Vertex is其中,持久性类型名称不能被重定义

• 持久性类型的依赖关系

– 在元组结构类型中,持久化类型的所有属性都必须是持久的

– 在聚合结构类型中,其元素类型也必须持久。

– 在继承的is-a层次内部,一个持久类型的超类型(祖先)必须是持久的

Page 46: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

46

对象的持久性

• 一个对象实例的持久化可以采用以下几种途径:

– 按类型持久:一个持久化类型的实例可以自动确认为持久

• 缺点:使用不方便,在需要持久和临时共存时,操作困难。有的系统采用持久意向概念,即持久类型实例化的对象可能潜在变为持久

– 按创建持久—将持久操作与初始化操作绑定,

即将持久对象与临时对象采用不同的初始化子

Page 47: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

47

对象的持久性-续

– 提供一个持久化操作,即用显式的持久化操作

将对象持久化。即将持久化声明延迟到对象创

建之后

– 按引用声明持久:仅对一个(或多个)对象显

式的声明为持久对象(根对象)。其他对象的

持久化定义为沿着根对象的引用链进行持久化

扩展

• 优点:持久化定义简洁

• 缺点:系统确定持久化对象的代价较大

Page 48: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

48

GOM的对象持久化方法

• GOM采用创建持久和提供一个持久化操作两种方法:– GOM提供一个持久化操作子(persistence)

• 例如:aVertex.persistenceaVertex在持久化操作之前仍然是临时对象

– GOM提供初始化阶段的持久化操作

• GOM不支持按引用声明持久方法,GOM不能确保持久对象不引用临时对象,带来的危险行为是:– 当用户从一个持久化对象中引用了一个临时对象时,会导致浮动引用

Page 49: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

49

持久对象的实现方法

• 地址依赖方法:

– 当声明一个对象持久化时,系统初始化一特定的外存区域,并提供一个持久化地址指针

• OID持久方法:

– 对持久化对象的标识进行持久化

Page 50: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

50

持久对象的存储和访问

• 有三种访问策略:– 名字法:在持久化区域内按名字查找——不适

合有大量对象的情况

– 通过OID或持久化指针查找

– 系统对每一个持久类型提供一个持久性容器——其区间存放同类型的持久对象

• GOM支持名字法和通过OID或持久化指针

查找种方法

Page 51: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

51

变量的持久化

• 变量的持久化声明:– Persistence var myVertices:Vertexset;

aVertex:Vertex;– 使用要求:

• 变量名必须保持唯一性,无二义性

• 变量类型必须已定义为持久性

– 持久性变量由系统管理:它的值在定义它的程序结束后,仍然有定义

– 问题:系统不能保证持久性变量引用一个临时对象,因此会产生悬空引用,即它的值在再次赋值前是未定义的

Page 52: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

52

垃圾回收

• 对于不再被使用的对象,应当及时从DB库中删除,

• 删除的复杂性由以下原因引起:

– 对象的共享

– 不可及对象的检查困难• 对象O既不是任何集合或列表的成员,又不被任何

属性或变量引用;

• 对无递归引用的对象,一般采用引用计数器法;

• 对递归引用,采用Garbage算法。

Page 53: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

53

垃圾回收-续

– 提供一个对象的显示删除操作,该操作需要不

但能删除最外层的对象,也能删除它的引用对

– 因此delete操作需定义一个重载操作进行引用

链的捆绑删除

问题:显示删除容易造成共享对象的悬空访问

Page 54: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

54

o

o2o1

Page 55: 第三章 类型与对象 - USTChome.ustc.edu.cn/~zhangm00/study/shujuku/3.pdf6 面向对象类型 • 对象系统强调的是对象状态的变化 • 对象生命周期中的某一瞬间是一个状态

55

• 习题

7.27.47.9