Hitachi

VisiBroker Version 5 Borland(R) Enterprise Server VisiBroker(R) プログラマーズリファレンス


20.9 Valuetype

IDLのvaluetypeは,IDLのvaluetypeと同じ名前のC++クラスにマッピングされます。このクラスは,valuetypeの状態メンバに対応する純粋仮想アクセッサとモディファイア関数,およびvaluetypeのオペレーションに対応する純粋仮想関数を持つ抽象ベースクラスです。

C++クラス名がvaluetypeの完全なスコープ名称に"OBV_"を持つ,C++クラスが生成されます。このC++クラスは抽象ベースクラスのアクセッサ,およびモディファイアの,デフォルトインプリメンテーションを提供します。

valuetypeインスタンスは,アプリケーションで生成します。生成後,これらのアプリケーションはポインタを使ってインスタンスを処理します。C++ valuetypeインスタンスへのハンドルは,C++ポインタです。C++ポインタ,または類似のオブジェクトとして実装されるC++ _ptr型にマッピングされるオブジェクトリファレンスとは異なります。これによって,ハンドルとオブジェクトリファレンスを区別できます。

インタフェースのマッピングとは異なり,valuetypeのリファレンスカウント機能は,valuetypeのインタフェースごとに実装しなければなりません。valuetypeの_var型はリファレンスカウントを自動化します。コードサンプル20-43では,この機能を示します。

コードサンプル20-43 リファレンスカウントを自動化するvaluetypeの_var型
 valuetype Example {
  short op1();
 long op2( in Example x );
 private short val1;
 public long val2;
};

また,コードサンプル20-44では,IDL定義に対して生成される三つのクラスのC++マッピングを示します。

コードサンプル20-44 IDL定義のC++マッピング
class Example : public virtual CORBA::ValueBase {
public:
   virtual CORBA::Short op1() = 0;
   virtual CORBA::Long op2(Example_ptr _x) = 0;
// すべてのパブリックな状態の純粋仮想getter/setterです。
// これらのアクセッサは,C++のunionメンバと同じように,
// リファレンスによってread-write属性でアクセスできます。
virtual void val2(const CORBA::Long _val2) = 0;
virtual const CORBA::Long val2() const = 0;
 
protected:
Example() {}
virtual ~Example() {}
virtual void val1(const CORBA::Short _val1) = 0;
virtual const CORBA::Short val1() const = 0;
 
   private:
void operator=(const Example&);
};
class OBV_Example: public virtual Example{
public:
virtual void val2(const CORBA::Long _val2) {
_obv_val2 = _val2;
}
virtual const CORBA::Long val2() const {
return _obv_val2;
}
 
protected:
virtual void val1(const CORBA::Short _val1) {
_obv_val1 = _val1;
}
virtual const CORBA::Short val1() const {
return _obv_val1; }
OBV_Example() {}
virtual ~OBV_Example() {}
OBV_Example(const CORBA::Short _val1,
     const CORBA::Long _val2) {
   _obv_val1 = _val1;
   _obv_val2 = _val2;
}
CORBA::Short _obv_val1;
CORBA::Long _obv_val2;
};
 
class Example_init : public CORBA::ValueFactoryBase {
};

_initクラスは,valuetypeのファクトリを実装する方法を提供します。valuetypeは,回線上を値で渡されます。そのため,ストリームして送信したvaluetypeの受信側が,ストリームからvaluetypeインスタンスを生成するために,ファクトリを実装します。ストリーム上でvaluetypeを受信する可能性がある場合は,サーバとクライアントの両方がこのファクトリを実装している必要があります。コードサンプル20-45で示すように,_initクラスはCORBA::ValueBase *を返すcreate_for_unmarshalも実装してください。コードサンプル20-46およびコードサンプル20-47では,ほかのvaluetypeからvaluetypeを派生させる例を示します。

コードサンプル20-45 _initクラス例
class Example_init_impl: public Example_init{
public:
   Example_init_impl();
   virtual ~Example_init_impl();
CORBA::ValueBase * create_for_unmarshal() {
 ...// return an Example_ptr
 }
};
コードサンプル20-46 ほかのvaluetypeから派生したvaluetypeのIDL
valuetype DerivedExample: Example{
 short op3();
};
コードサンプル20-47 派生valuetypeに対して生成されたC++
// IDL valuetype: DerivedExample
class DerivedExample  : public virtual Example {
 public:
   virtual CORBA::Short op3() = 0;
 protected:
   DerivedExample() {}
   virtual ~DerivedExample() {}
 private:
   void operator=(const DerivedExample&);
};
class OBV_DerivedExample: public virtual DerivedExample, public virtual OBV_Example{
 protected:
   OBV_DerivedExample() {}
   virtual ~OBV_DerivedExample() {}
};
class DerivedExample_init : public CORBA::ValueFactoryBase { };

コードサンプル20-48に,派生したvaluetypeをベースのvaluetypeに切り落とす例を示します。これは,ストリームの受信側が,派生valuetypeは構築できないが,ベースvaluetypeは構築できる場合に必要です。

コードサンプル20-48 切り落とされた派生valuetype
valuetype DerivedExample : truncatable Example { };

マッピングは通常の派生したvaluetypeと同じですが,Exampleというベースクラスに切り落とされることを示すため,DerivedExampleクラスのType情報に情報が追加されるという点が異なります。

valuetypeはインタフェースからは派生できませんが,インタフェースのすべてのオペレーションを提供することによって一つ以上のインタフェースをサポートできます。この場合,supportsというIDLキーワードを使用できます。

コードサンプル20-49 派生valuetypeのIDLキーワード「support」
interface myInterface{
 long op5();
};
 
valuetype IderivedExample supports myInterface {
 short op6();
};
コードサンプル20-50 派生valuetypeのC++
// IDL valuetype: DerivedExample
class IderivedExample  : public virtual CORBA::ValueBase  {
 public:
   virtual CORBA::Short op6() = 0;
   virtual CORBA::Long op5() = 0;
 
 protected:
   IderivedExample() {}
   virtual ~IderivedExample() {}
 private:
   void operator=(const IderivedExample&);
};
 
class OBV_IderivedExample: public virtual IderivedExample{
 protected:
   OBV_IderivedExample() {}
   virtual ~OBV_IderivedExample() {}
};

リファレンスカウント用に,C++ マッピングは二つの標準クラスを提供します。クラスCORBA::DefaultValueRefCountBaseは,任意のアプリケーションが提供する,どのIDLインタフェースからも派生しない具象valuetypeのベースクラスとして使用します。この種類のvaluetypeの場合,アプリケーションは独自のリファレンスカウントメカニズムを実装できます。クラスPortableServer::ValueRefCountBaseは,任意のアプリケーションが提供する,一つ以上のIDLインタフェースから派生する具象valuetypeクラスのベースクラスとして使用します。

〈この節の構成〉