Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.2 サーバアプリケーションのプログラミング(Basic Object Adapter:BOA)> 5.2.1 静的スケルトンインタフェース

5.2.1.3 インタフェース実装関数

 初期化処理の後、サーバアプリケーションで実装するインタフェースの処理を記述します。インタフェースを実装する方法として、以下の2種類があります。

implクラス方

 派生クラスのメソッドとして実装する方法です。以下に特長を示します。

TIEクラス方

 テンプレートクラス機能を利用して実装する方法です。以下に特長を示します。

備考
 TIEクラス方式を使用する場合は、IDLcコマンド実行時に-tieオプションを指定する必要があります。

 それぞれの実装方法について、以下のIDL定義をもとに説明します。

IDLファイル

  module ODdemo{
      interface  calculator{
          exception ZEROPARAM {};
          struct result {
              long     add_result; 
              long     subtract_result; 
              long     multiple_result; 
              float    divide_result; 
          };
          result calculate( in long a, in long b ) 
              raises( ZEROPARAM ); 
      };
  };

(1)implクラス方式

 implクラスを使用する場合、以下を記述します。
  インタフェース実装関数

インタフェース実装関数

 インタフェース実装関数は、"モジュール名_インタフェース名_impl"という名前で定義されたインタフェース実装クラスのメンバ関数として実装します。

// IDLで生成されるヘッダ定義
  class ODdemo_calculator_impl {
  public: 
      ODdemo::calculator::result calculate( CORBA::Long, CORBA::Long, CORBA::Environment & ) 
            throw ( CORBA::Exception ); 
  }

  // インタフェースの実装
  ODdemo::calculator::result                  // 復帰値の型
  ODdemo_calculator_impl::calculate(          // addメソッドの実装
      CORBA::Long  a,                         // 入力値
      CORBA::Long  b,                         // 入力値
      CORBA::Environment & )                  // エラー値
      throw( CORBA::Exception ) 
  {
      if( b == 0 ){                           // 0除算チェック
          ODdemo::calculator::ZEROPARAM  exc;
          throw( exc ); 
      }

      ODdemo::calculator::result res; 
      res.add_result = a+b;                   // 加算結果設定
      res.subtract_result = a-b;              // 減算結果設定
      res.multiple_result = a*b;              // 乗算結果設定
      res.divide_result = (CORBA::Float)a/b;  // 除算結果設定
      return res; 
  }

(2)TIEクラス方式

 TIEクラスを使用する場合、以下を記述します。
  インタフェース実装クラス
  インタフェース実装関数
  インタフェース実装クラス割当て関数

インタフェース実装クラス

 インタフェース実装クラスには、以下の定義をpublic属性として含める必要があります。
  デフォルトコンストラクタ
  デストラクタ
  オペレーション/アトリビュートの実装関数

 オペレーションとアトリビュートの実装関数は、IDLコンパイラが生成するヘッダに定義されているインタフェースと同一の名前にします。ただし、"throw( CORBA::Exception )"は必要ありません。

 その他のメンバ定義やクラス名は適宜追加することができます。

  class  CalculatorImpl {
  public:
      CalculatorImpl();        //コンストラクタの宣言
      ~CalculatorImpl();       //デストラクタの宣言
      ODdemo::calculator::result
      calculate  (             //オペレーションの宣言
            CORBA::Long    a,
            CORBA::Long    b,
            CORBA::Environment  & );
  };

インタフェース実装関数

 インタフェース実装関数は、インタフェース実装クラスのメンバ関数として定義します。
 デフォルトコンストラクタとデストラクタでは、特定の処理を記述する必要はありませんが、独自の処理を記述することもできます。

  CalculatorImpl::CalculatorImpl()
  {
  }

  CalculatorImpl::~CalculatorImpl()
  {
  }

  ODdemo::calculator::result                  // 復帰値の型
  CalculatorImpl::calculate(                  // メソッドの実装
      CORBA::Long    a,                       // 入力値
      CORBA::Long    b,                       // 入力値
      CORBA::Environment   & )                // エラー値
  {
      if( b == 0 ){                               // 0除算チェック
          ODdemo::calculator::ZEROPARAM  exc;
          throw( exc );
      }
      ODdemo::calculator::result res;
      res.add_result = a+b;                       // 加算結果設定
      res.subtract_result = a-b;                  // 減算結果設定
      res.multiple_result = a*b;                  // 減算結果設定
      res.divide_result = (CORBA::Float)a/b;      // 除算結果設定
    return res;
  }

インタフェース実装クラス割当て関数

 インタフェース実装クラス割当て関数は、インタフェース実装クラスを生成し、TIEクラスにインスタンスを設定します。この関数は、クライアントからリクエストを受け取ったときに自動的に呼び出され、インタフェース実装クラスのインスタンスが生成されます。
 TIEクラスとインタフェース実装クラス割当て関数の名前は以下のようになります。
   TIEクラス: _tie_インタフェース名
   インタフェース実装クラス割当て関数: インタフェースクラス_ptr _ct_インタフェース名();

 インスタンスの生成はデフォルトコンストラクタで行う必要はなく、パラメタ付きのコンストラクタやoperator演算子などを利用して行うようにすることもできます。TIEクラスにインスタンスを設定するためのコンストラクタは1つに限定されており、TIEクラスを割り当てるときは必ずインタフェース実装クラスのインスタンスを引数として渡さなければなりません。

  ODdemo::calculator_ptr  _ct_ODdemo_calculator()
  {
      CalculatorImpl  *impl = new CalculatorImpl();
      _tie_ODdemo_calculator<CalculatorImpl>    *tie
             = new _tie_ODdemo_calculator<CalculatorImpl>(*impl);
      return  tie;
  }

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005