接口定义语言(IDL)

1.4 接口定义语言(IDL)
一个IDL文件定义公共的应用程序接口(API),通过服务程序中的对象向外公布。一个CORBA对象的类型称作接口,

 

与C++中的类或者Java中的接口类似。IDL接口支持多重继承。

一个IDL文件示例如图1.1所示。IDL接口可以包括方法和属性。很多人都误以为一个IDL接口的属性类似于C++中的示

例变量(或者Jave中的域)的概念。这是错误的。一个属性只是在语法上对一对儿get-和set-类型方法的称谓。属

性可以是只读的,这种情况时该属性只有一个get-类型的方法。

*****************************************************************************************************
module Finance {
    typedef sequence<string> StringSeq;
    struct AccountDetails {
    string name;
    StringSeq address;
    long account number;
    double current balance;
    };
    exception insufficientFunds { };
    interface Account {
        void deposit(in double amount);
        void withdraw(in double amount)
            raises(insufficientFunds);
        readonly attribute AccountDetails details;
    };
};
*****************************************************************************************************
图 1.1: IDL文件示例

方法的参数有一个指定的方向,可以是in(意味着参数由客户程序传入服务程序),out(参数从服务程序传回客户

程序)或者inout(参数是双向传递的)。方法同样可以有返回值。方法在某块出错时可以引发(抛出)一个异常。

有30多种预定义的异常类型,称作系统异常,他们都可以由方法抛出,尽管在实际系统中CORBA运行时系统引发的异

常多于应用程序代码引发的。除了预定义的系统异常,新的异常类型可以在IDL文件中定义,这些异常可称为用户定

义的异常。方法署名的raises子句指定该方法可能抛出的用户定义异常。

方法的参数(包括返回值)可以是内置类型的一种——例如:string,boolean或者long,也可以是IDL文件中定义

的用户自定义的类型。用户定义类型可以是一下的任意一种:

结构体。类似于C/C++中的结构体或者Java中只包含公共域的类。

序列。集合类型,就像一个可以增或减的一维数组。

数组。IDL数组的维度在IDL文件中指定,所以数组是固定大小的,这就是说他不能在运行时增或者减。数组在IDL中

很少用到。序列类型更灵活,所以用的更多。

自定义。给现存的类型定义一个新名字。例如,下面的语句定义age可用来描述short。
    typedef short age;
默认情况下,IDL的序列和数组是匿名类型,也就是说他们没有名字。通常使用typedef的重要意义在于给序列或者

数组的声明关联一个名字。例句可以在图1.1中StringSeq的定义中看到。

联合体。该类型可以在运行时保留多个值中的一个。例如:
union Foo switch(short) {
    case 1: boolean boolVal;
    case 2: long longVal;
    case 3: string stringVal;
};
一个Foo类型的实例可以保存一个boolean、long或者string值。前面的case标记(成为判别式)表明当前是哪种值

。与IDL联合体相同的理念可以在很多面向过程的语言中找到。但是,他们很少在面向对象的语言中使用,因为多态

统称能以更好的方式达到同样的目的。

枚举类型。枚举在概念上类似于一个常整型集合的声明。例如:
enum color ( red, green, blue );
enum city ( Dublin, London, Paris, Rome );

从本质上说,CORBA使用整数表达不同的枚举值,使用枚举声明的好处在于很多编程语言都有对它的内在支持,或者

相似的机制,可以用来进行强类型判识,这样程序员就不会将city变量和color变量相加。

定点类型。定点类型保存定点数值,而float和double类型保存浮点数值。浮点计算适用于很多用途,但是,可能导

致几个小数位后的舍入误差。对比来说,定点数值可能比对应的浮点数值占用更多的内存空间,但是他们有避免舍

入误差的优点。使用定点数值趋向于限制在适当的应用领域。例如金融计算和数字信号处理等。尽管一个工程使用

定点类型数字,它很可能使用定点计算作为细节实现却不将定点数字的使用公布为公共的IDL接口。由于以上原因,

定点类型很少在IDL文件中声明。

值类型。在9.2节、96页讨论。

IDL类型可以组织在一个module中。module结构与C++中的namespace或者Java中的package有异曲同工之妙,也就是

说,他事先给类型名称前添加了一个前缀,以避免命名空间冲突。IDL中的域操作符是“::”。例如,

Finance::Account是Finace模块中定义的Account类型的全域名。

posted @ 2010-03-27 17:24  园木  Views(5739)  Comments(0Edit  收藏  举报