《關於VisiBroker For Delphi的使用》——CORBA技術實踐(三)
宜昌市中心人民醫院 趙普昉 email:
[email protected]三、數組對象與簡單數據對象的傳遞前面提到了一些較為簡單的數據操作,我們都可以想象一下,如果操作CORBA對象與操作C/S結構的數據對象一樣的方便,那麼CORBA又有什麼神奇了,不知道看過李維的分布式多層應用系統的書籍時,是否留意到李維對CORBA的評價,無論你看過還是沒有看過,我都要告訴正在使用CORBA編程的朋友們,CORBA比COM/COM+簡單,而CORBA的跨平台特性,以及與COM/COM+同樣的負載平衡能力,足以讓我們將這項分布式技術應用到應用體系的設計之中,其實對於使用Borland的產品開發分布式系統無論你采用CORBA或是COM/COM+其實最核心的技術就是MIDAS,因為你總可以在CORBA/COM/COM+中看到MIDAS的影子,所以我建議無論你是准備學習CORBA還是學習COM/COM+最好先學習一下MIDAS,本文不涉及MIDAS,關於MIDAS請看李維的《Delphi5.X分布式多層應用—系統篇》。
為什麼我從開始就一直要大家使用文本編輯器之類的東西書寫IDL,而不用TypeLibrary來書寫IDL,其實我覺得只是為了讓剛剛接觸CORBA的程序員獲得一些更多的IDL方面的知識罷了,在實際的開發中你可以完全很方便的使用TypeLibrary來編寫接口規則。
下面我簡要的列舉幾類IDL書寫的事例與利用IDL2PAS生成的PASCAL代碼。
1、常量的定義
/**IDL書寫**/
module MyCRB{
const long iMyConst=1;
interface myFace {
const long iiMyConst=2;
};
};
/**Pascal**/
unit MyCRB_I;
interface
uses Corba;
const
iMyCOnst:integer=1;
myFace_iiMyConst=2;
2、不在接口中申明的常量
/**IDL**/
module MyCRB{
const long myconst=1;
};
/*pascal*/
unit MyCRB_I;
interface
const myconst:integer=1;
3、枚舉類型
/*IDL*/
enum MyCRBKind{A,B,C,D,……..}
/*pascal*/
myCRBkind=(A,B,C,D……..);
4、結構體
/*IDL*/
struct mystructtype{
long X;
string Y;
boolean Z;
};
/*pascal*/
//XXX_I.pas
type mystructtype=interface;
//XXX_C.pas
mystructtype=interface
function _get_X:integer;
function _get_Y:string;
function _get_Z:boolean;
procedure _set_X(const Value:integer);
procedure _set_Y(const Value:string);
procedure _set_Z(const Value:boolean);
property X:integer read _get_X write _Set_X;
property Y:string read _get_Y write _Set_Y;
property Z:boolean read _get_Z write _Set_Z;
…….
還有太多的代碼,自己創建一個看一
下,為了節約篇幅我就不做詳細的翻譯了
下面請大家試一下以下的申明會生成什麼樣的Pascal代碼
5、聯合體
union un_exp switch(long)
{
case 1:long x;
case 2:string y;
case 3:st_exp Z;
};
6、sequence(我理解為動態數組)
typedef sequence UnboundeSeq;
typedef sequence ShortBoundSeq
7、數組
const long ArrayBound=10;
typedef long longArray[ArrayBound];
8、抽象接口
module exp{
interface myface{
long op(in string s);
};
};
9、多重繼承
module M{
interface A{
void A1();
void A2();
};
interface B{
void B1();
void B2();
};
interface AB:B,A{
void AB1()
void AB2();
};
};
10、交叉模型定義
module m1{
interface if1;
module m2{
interface if2{
m1::if1 getIf1();
};
interface if1{
m2::if2 getif2()
};
};
};
以上我介紹了一些數據的定義規范,然而我們需要不僅僅是這樣的一些比較抽象的接口定義法則,我們要將法則應用到實際的開發中去,那麼我們又是如何運用這些法則了,對於接口描述語言的翻譯我前面講到直接使用IDL2PAS就不講了,以後的章節中也不會在去將如何轉換的問題。下面我們實踐一下:
編寫接口定義一個返回為浮點類型,輸入為短整型變量數組對象的方法
typedef short ArrayType[3];
//自定義類型定義長度為3的數組
interface Account {
float InputArray(in ArrayType myArray);//輸入為整形數組,返回類型為float的方法
};
//服務端程序的處理