12.属性服务
?6 P) p2 e" o9 c* [ 允许将任意的属性与对象关联起来,被关联的对象必须实现 ProperySet接口。" |* k7 x2 ]( M0 @9 p
13.对象查询服务) D3 ^& M/ i6 R! ]$ t
依靠属性定位对象。3 k+ t$ v$ i5 I9 t$ Z' d6 v
15.时间服务0 \7 F# p: L J/ j
拥有众多异步时钟的分布式系统 固有的误差问题。' R0 e9 @2 F( O K. j$ E
10.1.3 CORBA 构件模型
& q* w5 {: n3 r" A# z9 _ CORBA 对象适配器主要的作用 就是在一个 ORB 和 真正接收调用并且返回结果的 对象之间 进行交互。
$ m# H7 f3 q* o! ?- Z9 A- q+ J 10.2 SUN 公司的方式6 V. j7 w! X! p' `" m5 D
Java 构件技术的概述* F9 b, O v5 O9 M
Java中,编译器会检查 Applet 代码的安全性,通过了编译器检查的 Applet 代码不会带来安全隐患。0 t( d1 H, |0 x* q: t I
由于编译得到的字节码仍然可能被人修改,代码在装载时刻会被再次检查(称为“校验”)。
9 F# F3 Z7 c Q. N R; y 运行环境(Runtime Environment,RE)、软件开发工具包(Software Development Kit,SDK)、参考实现。# _- I( a- h4 v: {0 S! b
运行环境是 Java 虚拟机 和 必须具有的 J2SE API 的实现。# C2 z/ D! w% M* I3 A4 l7 E! D
10.3 Microsoft 的方式
0 j. j, ~: l2 w" I5 i 微软选择的是最简单的路线,他没有提出一整套标准;相反,他不断对已有的应用和平台基础进行再工程,这就可以获益于以前的成功技术。
7 ~/ v: `8 ~, x4 k3 q; K' \: D. U: A 语言无关性,作为 CLR 的一条主要原则。1 F. m1 Y1 p( G# A
10.3.1 第一个基础关联模型——COM/ G+ k. L$ d( C( [6 @# C
COM 所定义的一个基础实体是接口。在二进制层面上,一个接口被表示为指向一个接口节点的指针。7 s, k4 \' ^# k( j% x8 S+ g
接口节点 唯一被指定的部分是 置于其内部第一个域的 另一个指针,这个指针指向一个过程变量表(或者说,函数指针表)。. c0 O, Z+ {. a: P, K* B
每个 COM 对象都有 IUnknown接口,通常置于 COM对象图的顶端。7 z* v( Y/ ^. f- u+ R6 {4 P6 f
他的“真实”名字是他的 IID,即 00000000-0000-0000-C000-000000000046 为了方便,所有接口也有一个 可读名。
; {; D$ W" Z6 d6 c 根据习惯,可读接口名以字母I开头。与 IID 不同,可读接口名 并不保证是唯一的。因此,编程中的接口引用均使用 IID。% u0 J8 P0 y1 S( [
IUnknown 接口的首要用途是在 最抽象的情况下 标志 COM对象,此时 COM对象 没有任何特殊功能。, g5 J# n" p8 } ]* n# y! }# K
IUnknown 接口 只提供对任何 COM接口都必须的三个强制性方法。QueryInterface、AddRef、Release,后两个强制性方法被用来控制对象的生命周期。
$ y* c4 f* ^8 C0 F9 M, K, ] c! j+ J 类型 HRESULT 被大多数 COM接口的方法用来表示调用成功或失败。 QueryInterface表明查询的接口是否被支持。
# M/ _; Q) x1 m6 ^( ~/ E! G 每个 COM对象都会进行引用计数,引用计数变量被共享使用的情况下,COM对象 不能释放接口节点。
7 ^- d% g H, ^ 一般这样做没有问题,也是通常的做法。2 V+ `2 ^) s z* h% S$ O- l7 p
某些情况下占用很多资源,可以使用独立的引用计数变量,以便节点可以尽早释放。这种根据需要创建和删除接口节点的技术有时被称作“快速装卸接口(Tear-Off Interface)”</p> 10.3.2 COM对象重用
: S) p. ~- W$ J1 J0 c COM不支持任何形式的实现继承。1 E2 t% b2 i) Y+ ^* m
COM支持两种形式的对象组装:包含(Containment)和 聚集(Aggregation)。
# ^. `; Z- n' m' l& B9 B# l 包含 是一个对象 拥有 指向另一个对象的唯一引用。
1 j. q( L- O! U& S; v0 ] 外部对象 只是把请求转发给内部对象,所谓转发 就是调用内部对象的方法。. L/ d/ A2 P- O% y; a+ e
包含能重用内含于其他构件的实现,是完全透明的。
' E9 Y2 d$ S( I- b9 O 如果包含层次较深,或者被转发的方法本身相对简单,包含会存在性能上的问题。因此 COM定义第二类重用形式,聚集。% I* W' n0 V8 z/ U* P$ u! J
聚集直接把内部对象接口引用传给外部对象的客户,而不是再转发请求。4 S6 j. [8 }% ]7 R2 N
保持透明性是很重要的,因为外部对象的客户无法辨别哪个特定接口是从内部对象聚集而来的。
0 B4 H/ ]$ X! g% @ 10.3.3 接口和多态% Q' e6 Q' O, X
COM接口可通过(单)接口继承 从其他 COM接口中派生。
9 \1 U8 l0 F, o) r1 o- ^' l! [$ h4 a COM 的接口继承与其支持的多态无关。2 G" z! y. D8 y7 h
接口和版本化,一旦公布,COM 接口和他的规范不允许以任何形式改变。* E! {4 I) o+ N" P) v# [% C$ r) D
既解决了语法问题,也解决了弱基类问题。, I) p( ]4 p: C" \4 C T, k
IID 可用于标志接口中的版本,因为接口总是通过IID被请求。, i1 E$ j2 `+ `* h" U$ h, N
CORBA 讨论中所提及的传递性版本冲突问题 在COM中不会发生。
- r7 w1 I" j, [- V9 o0 P6 Q9 r 构件可以选择实现接口的多个版本,处理方式就像处理 别的不同接口一样。
9 ^2 F( d t8 u; Y 基于COM的系统能并发支持旧接口和新接口。* P. i4 ]" O" i! w7 I) |" w. s$ ~
10.3.4 COM对象的创建和COM库
* H* g+ @7 e# O% ~8 A 创建 COM类 的实例对象时,COM需要把给定的 CLSID 映射为包含所请求的类的实际构件。COM 支持系统注册器,它类似 CORBA存储器。1 z P' F3 |: a; b
进程内(inprocess)服务器、本地服务器、远程服务器。8 }* W8 d" b: R
10.3.5 从 COM到分布式 COM(DCOM)
- \# _$ F0 X, b) j/ V 代理(Proxy)对象 和 服务器 桩(Stub)对象。2 b+ w' |; U4 Q4 ?7 i9 t
为支持 跨进程 或 跨机器 的透明通信,COM在客户端创建代理对象,在服务器端创建桩对象。
* B1 o' q, L' j* R 跨进程传递的 接口引用需要被映射为 对象引用。
; z5 P5 u4 z( y/ f& \ DCOM 将数据整理成平台无关的网络数据表达(NDR)形式。 z4 M4 D0 E( e) l0 k
10.3.6 复合文档和OLE 对象
( m0 A+ c, z; c2 d j0 p: S OLE 可被 概括为 一组预定义的 COM 接口。$ Q) N/ m1 `+ z- e* _7 c
文档容器 和 文档服务器。0 K: ?+ y6 v9 a5 b5 G3 c# n: }
文档服务器 是提供某种内容模型 和显示、操作内容的能力。文档容器没有自己的内容,但可以接受任意文档服务器提供的内容成分。
; Z- P0 g& k7 i 许多文档容器也是文档服务器,即是说,他们支持外来的成分,同时也有自己的内容。! Y4 }/ g( |. [6 e- i# }
10.3.7 .NET 框架6 G' J: m A/ Y
没有原始类型。 |