この特集のトップページへ
Chapter 1:オブジェクト指向から見たCOM+

見出し 1.1.3 インタフェースと実装の分離
 詳しくは後述するが,COMの機能は「インタフェース」と呼ばれる窓口を通じて利用される。C++には,COMインターフェースの実装に利用されている機構が言語仕様として取り込まれている。この言語仕様は,C++によるオブジェクト指向プログラミングや,その後発展してきたコンポーネント指向プログラミングに多大な影響を与えたことは間違いない。

 C++では,virtualと指定した仮想関数(virtual function)に対して“= 0”を追加することで純粋仮想関数(pure virtual function)を宣言し,その純粋仮想関数をメンバ関数としてクラスに追加することで抽象基本クラス(abstract class)を定義できるようになっている。COMインタフェースの定義に用いられているのは,この抽象基本クラスである。

 List 1-7に示すのは,COMの最も重要なインタフェースであるIUnknownインタフェースと,IUnknownインタフェースを継承したカスタムインタフェースであるIDictionaryインタフェース,さらにIDictionaryインタフェースを継承したCDictionaryクラスの定義である。

 各インタフェースとクラスの関係は,一見すると複雑に見えるため,Fig.1-4にモデリングツールを使用して生成した概念図を示しておくので参照してもらいたい。モデルから実際のソースコードを生成する機能も搭載され,今後はモデルからソースコードを生成する機能や,作成されたコンポーネントを配置する機能も搭載され,オブジェクトモデルの修正や調整を伴うシステム設計をより柔軟に実行できるようになると思われる。

Fig.1-4 UMLによるCOMインタフェースの記述
fig.1-4
 抽象基本クラスは,冒頭で解説したCAccountクラスのように基本クラスとしてメンバ変数やメンバ関数を実装することができない代わりに,抽象的なクラスとしてインタフェースの定義を公開することができる。抽象クラスのメンバ関数(メソッド)である純粋仮想関数は,抽象基本クラスではなく派生クラスで実装されるため,完全にインタフェースと実装とを分離できるのである。これが,C++でCOMコンポーネントを開発する最大のメリットといえる。

 では,ユーザーによって追加されるインタフェースは,どのように実装されるのだろうか。これは,ユーザーが定義したクラスを抽象クラスに継承させ,そのCOMクラスに抽象基本クラスで宣言されたメソッドや派生クラスで宣言したメソッドも実装することで実現されるのである。

 このように,C++に搭載されている継承の機能を使えば,オブジェクト指向的なさまざまな機能をCOMに実装できそうなものである。だが,C++で実装されたCOMは,一般的に単独のプログラムとして利用されるわけでもなければ,C++に閉じた開発環境で利用されるわけでもない。CやVisual Basic,Visual J++など,各種プログラミング言語で開発されたクライアントアプリケーションから呼び出して利用できなければならない。したがって,C++でCOMを開発する場合,オブジェクト指向プログラミングの機能を最大限に活用しつつ,ほかのどのようなプログラミング言語からも利用可能なコンポーネントとして実装することが求められる。逆にいうと,COMの規約に基づいたコンポーネントをそれぞれのプログラミング言語で構築しない限り,COMコンポーネントしては利用できないことになる。

 これらの考え方は,1993年に姿を現したOLE2(Object Linking and Embedding version 2)時代のCOMアーキテクチャで実現され,本稿の執筆時点でもOffice 2000やWindowsのあらゆるコンポーネントに受け継がれている。

prev Chapter 1 4/8 next