15.2 継承ベースのインタフェース実装
継承ベースのインタフェース実装の手法では、実装クラスは、OMG IDLインタフェース定義に基づいて生成されたベース・クラスから派生します。生成されたベース・クラスはスケルトン・クラスと呼ばれ、派生クラスは実装クラスと呼ばれます。インタフェースの各操作には、スケルトン・クラスで宣言された対応するメンバー関数があります。生成されたスケルトン・クラスは、インタフェースの各操作に対応するメンバー関数を備えていますが、プログラマにとってはオペークな部分もあります。メンバー関数のシグネチャは、生成されたクライアント・スタブ・クラスのシグネチャと同じです。
このインタフェースを継承で実装するには、プログラマはこのスケルトン・クラスから派生させて、OMG IDLインタフェースで操作ごとに実装する必要があります。ほかの基本インタフェース用のスケルトン・クラスと実装クラスから、エラーやあいまいさをなくして複数のインタフェースに移植性のある実装を可能にするには、スケルトンの仮想ベース・クラスにTobj_ServantBaseクラスを、Tobj_ServantBaseクラスの仮想ベース・クラスにPortableServer::ServantBaseを使用する必要があります。実装クラス、スケルトン・クラス、Tobj_ServantBaseクラス、およびPortableServer::ServantBaseクラスの継承は、すべてパブリック仮想でなければなりません。
実装クラスまたはサーバントは、単一の生成されたスケルトン・クラスからのみ直接派生する必要があります。複数のスケルトンから直接派生すると、_this()操作の定義が複数あるため、あいまいエラーが発生します。ただし、CORBAオブジェクトには単一の最終派生インタフェースのみがあるので、これは制限ではありません。C++サーバントが複数のインタフェース型をサポートしている場合、デレゲーション・ベースのインタフェース実装の手法に利用できます。インタフェース継承を使用するOMG IDLの例については、次のコード・スニペットを参照してください。
// IDL
interface A
{
short op1() ;
void op2(in long val) ;
};インタフェース・クラスAの例については、次のコード・スニペットを参照してください。
// C++
class A : public virtual CORBA::Object
{
public:
virtual CORBA::Short op1 ();
virtual void op2 (CORBA::Long val);
};サーバー側ではスケルトン・クラスが生成されます。このクラスは、インタフェースの各操作に対応するメンバー関数を備えていますが、プログラマにとってはオペークな部分もあります。
ポータブル・オブジェクト・アダプタ(POA)の場合、スケルトン・クラスの名前は、対応するインタフェースの完全にスコープ指定された名前の先頭に文字列「POA_」が付きます。また、このクラスは、サーバントのベース・クラスTobj_ServantBaseから直接派生します。次に、Tobj_ServantBaseのC++マッピングを示します。
// C++
class Tobj_ServantBase
{
public:
virtual void activate_object(const char* stroid);
virtual void deactivate_object (
const char* stroid,
TobjS::DeactivateReasonValue reason
);
}activate_object()およびdeactivate_object()メンバー関数の詳細は、「Tobj_ServantBase:: activate_object()」および「Tobj_ServantBase::_add_ref()」を参照してください。
次のコード・スニペットに、前述のインタフェースAのスケルトン・クラスを示します。
// C++
class POA_A : public Tobj_ServantBase
{
public:
// ... server-side ORB-implementation-specific
// goes here...
virtual CORBA::Short op1 () = 0;
virtual void op2 (CORBA::Long val) = 0;
//...
};インタフェースAがグローバル・スコープではなくモジュール内で定義されている場合(たとえば、Mod::A)、そのスケルトン・クラスの名前はPOA_Mod::Aになります。これは、サーバー・アプリケーションのスケルトンの宣言および定義と、クライアントから生成されたC++コードとを区別するのに役立ちます。
このインタフェースを継承で実装するには、このスケルトン・クラスから派生させて、対応するOMG IDLインタフェースで操作ごとに実装する必要があります。インタフェースAの実装クラスの宣言は、次のコード・スニペットに示す形式になります。
// C++
class A_impl : public POA_A
{
public:
CORBA::Short op1();
void op2(CORBA::Long val);
...
};親トピック: サーバー側マッピング