COM は、インターフェイス定義とその実装を根本的に区別します。
インターフェイス は、実際には、使用法が定義されているが実装が定義されていない関連する関数プロトタイプのグループで構成されるコントラクトです。 これらの関数プロトタイプは、C++ プログラミングの純粋な仮想基底クラスと同等です。 インターフェイス定義は、メソッド、戻り値の型、パラメーターの数と型、および実行する必要がある操作と呼ばれるインターフェイスのメンバー関数を指定します。 インターフェイスに関連付けられている実装はありません。
インターフェイス実装 は、プログラマがインターフェイス定義で指定されたアクションを実行するために提供するコードです。 プログラマがオブジェクト ベースのアプリケーションで使用できる多くのインターフェイスの実装は、COM ライブラリに含まれています。 ただし、プログラマは自由にこれらの実装を無視し、独自の実装を記述できます。 インターフェイスの実装は、そのオブジェクトのインスタンスが作成されるときにオブジェクトに関連付け、実装はオブジェクトが提供するサービスを提供します。
たとえば、IStack という名前の架空のインターフェイスでは、Push メソッドと Pop メソッドの連続する呼び出しが、以前に Push メソッドに渡された値を逆の順序で返すように指定する、Push と Pop という名前の 2 つのメソッドを定義できます。 このインターフェイス定義では、関数をコードで実装する方法は指定されません。 インターフェイスを実装する場合、あるプログラマはスタックを配列として実装し、その配列にアクセスするように Push メソッドと Pop メソッドを実装しますが、別のプログラマはリンクされたリストを使用し、それに応じてメソッドを実装します。 Push メソッドと Pop メソッドの特定の実装に関係なく、IStack インターフェイスへのポインターのメモリ内表現、したがってクライアントによるその使用は、インターフェイス定義によって完全に決定されます。
単純なオブジェクトは、1 つのインターフェイスのみをサポートします。 埋め込み可能なオブジェクトなどのより複雑なオブジェクトは、通常、複数のインターフェイスをサポートします。 クライアントは、そのインターフェイスの 1 つへのポインターを介してのみ COM オブジェクトにアクセスできます。これにより、クライアントはそのインターフェイスを構成する任意のメソッドを呼び出すことができます。 これらのメソッドは、クライアントがオブジェクトのデータを使用する方法を決定します。
インターフェイスは、オブジェクトとそのクライアントの間のコントラクトを定義します。 コントラクトは、各インターフェイスに関連付ける必要があるメソッドと、入力と出力の観点から各メソッドの動作を指定します。 コントラクトでは、通常、インターフェイスにメソッドを実装する方法は定義されていません。 コントラクトのもう 1 つの重要な側面は、オブジェクトがインターフェイスをサポートする場合、そのインターフェイスのすべてのメソッドを何らかの方法でサポートする必要があるということです。 実装内のすべてのメソッドが何かを行う必要があるわけではありません。 オブジェクトがメソッドによって暗黙的に示される関数をサポートしていない場合、その実装は単純な戻り値であるか、意味のあるエラー メッセージが返される可能性がありますが、メソッドは存在する必要があります。
関連トピック