Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18688925
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 08:54:46

octet 8位8位数保证传递过程中不变(char不是) 
IDL提供两个模板类型:sequence(序列)和string(字符串)。象数组一样,要用typedef指定sequence和string类型的名字 
一个序列是一个可变长度成员清单,成员可以为任何IDL类型。它象一维数组,但长度是不定的。它可以是有界的也可以是无界的,要看序列类型定义时指定的最大长度。例如,下面定义一个有界序列类型: 
typedef sequence ; 
这个类型的实例是一个长度小于等10的字节序列。 
下一行定义了一个无界限的字节序列类型: 
typedef sequence SomeBytes; 
这个类型的实例可以是任意长度的字节序列。 
string是一个字符序列。象序列一样,它可以是有界的: 
typedef string<15> Moniker; 
或无界的: 
typedef string Description; 
当定义一个有界字符串类型时,记住任何null结束符不算在串长度之内。使用string面不要用字符数组。字符数组中未初始化的成员在翻译过程中可能引起问题。 
结构类型 
IDL文件也可以定义结构类型,用关键字struct, union和enum。 
下边有一个结构类型定义的例子: 
struct StructName { 
char charMember; 
unsigned short AnotherMember; 
}; 
注意:这里没有typedef。对struct用typedef是不好的习惯,因为它会定义两个类型名字。 
enum(枚举)类型定义示例: 
enum Pet {cat, dog, fish, bird, rat, horse, gerbil}; 
IDL中的union必须是可区分(discriminated)的。即,用一个标记字段(tag field)说明联合的哪些成员是当前被赋值的: 
union Reference switch (short) { 
case 1 : { Title: string; Author: string; } 
case 2: URL: string; 
case 3: TopicID: long; 
}; 
常量 
IDL文件可以定义常量,这些常量可用于界面和类型的定义。用关键字const定义常量: 
const unsigned long LengthOfNameString = 15; 
IDL文件可以定义类型为long, unsigned long, unsigned short,char boolean,float,double,string的常量。注意,IDL不支持octet型的常量。 
整数常量可以用10、8、16进制形式说明。界面 
IDL文件中的界面描述了CORBA对象提供的功能。它封装客户使用界面所需的全部信息。每个界面对应CORBA上的一个类,其定义近似于类的定义: 
interface Example1 { 
readonly attribute string Name; 
attribute long Value; 
long AddToValue(in long Summand, out long Result); 
}; 
界面用关键字interface定义。在界面定义内部是一个属性和方法的清单。所有的属性和方法都是公开的(public)。这里没有私有(private)或保护(protected)的概念,因为这些应该在实现部分处理而不应在对象的公开界面里。  [Page]
属性 
界面没有成员变量。属性(Attributes)象Cbuilder的property(这种说法并不暗示值的方法相同)而不象成员变量。用关键字attribute定义。 
如果不允许客户写属性,定义时要加readonly前缀。 
Readonly attribute float Balance; 
注意:尽管attribute的行为表现得象properties,但它们并不是用Cbuilder的properties(不可移植)实现的。相反,属性(attributes)被编译成与属性同名的getter(及可选的setter)方法。 
方法 
方法定义必须包括返回值类型。 
另外,它们必须在每个参数中用关键字in,out,inout提供用法说明,每个参数都必须命名。 
通常,方法调用在对象处理调用时是阻塞的(blocked)。然而,IDL语法允许一个方法申明为oneway,如果调用者确实不需要等待响应的话。 
Oneway void SendInformation(long Value); 
重复的方法名是非法的,因为CORBA是可用于支持方法重载的编程语言的。 
注释: 
界面中可以加注释,用和C++相同的//。 
// this is a comment 
类型定义 
界面可以包括类型定义: 
interface Example2 { 
struct Example2Struct { 
string Name; 
long Value; 
}; 
// …其它定义部分 
}; 
在同一界面中的定义可以用名字(Example2Struct)引用这些类型,但该界面外的定义必须使用范围限定符(Example2::Example2Struct)。 
异常 
除了attributes, methods, types, 界面还可以包括用户定义异常处理: 
interface ExceptionExample { 
exception ValueOutOfBounds { 
long value; 
void SetValue(in long Value) 
raises (ValueOutOfBounds); 


SetValue方法指出它可能抛出ValueOutOfBounds异常。这个例子显示一个成员的一个异常,它可以帮助调试。然而,界面也可以包括无成员包括的花括号{}里的异常。 
上下文(Contexts) 
方法可以附带context子句。客户可以维护一个或多个CORBA上下文对象,它提供标识符(indentifier)到字符串(string)值的映射。一个IDL方法可以用关键字context申明对特定标识符的映射必须提供给它的客户: 
interface ContextExample { 
long SomeMethod(in long Value, in char Letter) 
raises (/* */) 

[NextPage]

context(“value1”, “value2”); 
}; 
}; 
ContextExample的调用者必须传送一个context对象作为参数。 
模块(Modules) 
IDL文件将一些定义结合成模块。模块的概念和名字空间(namespace)是一样的:它允许定义组合成逻辑单元并预防命名空间冲突。一个模块定义一个名字空间,就象这样: 
module SyntaxExamples { 
interface Example1 {  [Page]
// definitions here 
}; 
interface Example2 { 
// definitions here 
}; 
}; 
模块外的定义访问模块内的定义必须加范围界定符(SyntaxExamples::Example1)。 
继承(Inheritance) 
正如C++类,IDL界面可以作为其它类的后代而建立。子代界面继承祖先界面的属性和方法: 
interface Ancestor{ 
//definitions here 
}; 
interface Desendant:Ancestor { 
// more definitions here 
}; 
注意:因为没有界面相关的实现部分,衍生界面重载相应类方法时不得再在成员函数中列出。 
界面支持多继承,但所有祖先界面都不能有包含相同名字的定义。 
所有的IDL界面都是隐含继承了CORBA界面Object。这意味着一个类型为Object的参数可以接受任何CORBA对象。 
提前引用(Forward references) 
如果两个界面互相引用,IDL文件必须一个包含对其中一个的提前引用,即一个界面可以引用IDL文件中其后部分的定义。如下所示: 
interface Example2; // forwar reference 
interface Example1 { 
//definitions 
readonly attribute Example2 TheOtherOne; 
}; 
interface Example2 { 
//definitions 
Example1 ReturnTheOtherOne(); 
}; 

阅读(525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~