インターフェイスとインターフェイスの実装

COM では、インターフェイス定義とその実装が根本的に区別されます。

インターフェイスは、実際には、使用法が定義されているが実装が定義されていない関連する関数プロトタイプのグループで構成されるコントラクトです。 これらの関数プロトタイプは、C++ プログラミングの純粋な仮想基底クラスと同等です。 インターフェイス定義では、メソッドと呼ばれるインターフェイスのメンバー関数、戻り値の型、パラメーターの数と型、および実行する必要がある処理を指定します。 インターフェイスに関連付けられている実装はありません。

インターフェイス実装は、プログラマがインターフェイス定義で指定されたアクションを実行するために提供するコードです。 プログラマがオブジェクトベースのアプリケーションで使用できるインターフェイスの多くは、COM ライブラリに実装されています。 ただし、プログラマは自由にこれらの実装を無視し、独自の実装を記述できます。 インターフェイス実装は、オブジェクトのインスタンスが作成されるときにオブジェクトに関連付けられ、実装はオブジェクトが提供するサービスを提供します。

たとえば、IStack という名前の仮想インターフェイスは、Push と Pop という名前の 2 つのメソッドを定義し、Pop メソッドへの連続呼び出しが、以前に Push メソッドに渡された値を逆の順序で返すように指定するとします。 このインターフェイス定義では、関数をコードで実装する方法は指定されません。 インターフェイスを実装する際、あるプログラマーはスタックを配列として実装し、その配列にアクセスする方法で Push メソッドと Pop メソッドを実装する可能性があり、別のプログラマーはリンク リストを使用し、それに応じてメソッドを実装する可能性があります。 Push メソッドと Pop メソッドの特定の実装に関係なく、IStack インターフェイスへのポインターのメモリ内表現、つまりクライアントによるその使用は、インターフェイス定義によって完全に決定されます。

単純なオブジェクトは単一のインターフェイスのみをサポートします。 埋め込み可能なオブジェクトなどのより複雑なオブジェクトは、通常複数のインターフェイスをサポートします。 クライアントは、いずれかのインターフェイスへのポインターを介してのみ COM オブジェクトにアクセスできるため、クライアントはそのインターフェイスを構成する任意のメソッドを呼び出すことができます。 これらのメソッドは、クライアントがオブジェクトのデータを使用する方法を決定します。

インターフェイスは、オブジェクトとそのクライアントの間のコントラクトを定義します。 コントラクトでは、各インターフェイスに関連付ける必要があるメソッドと、入出力に関して各メソッドがどのような動作をする必要があるかを指定します。 コントラクトでは、通常、インターフェイスにメソッドを実装する方法は定義されていません。 コントラクトのもう 1 つの重要な側面は、オブジェクトがインターフェイスをサポートする場合、そのインターフェイスのすべてのメソッドを何らかの方法でサポートする必要があることです。 実装内のすべてのメソッドが何かを行う必要があるわけではありません。 オブジェクトがメソッドによって暗示される関数をサポートしていない場合、その実装は単純な戻りであるか、意味のあるエラー メッセージを返すことになる可能性がありますが、メソッドは存在する必要があります。

COM のオブジェクトとインターフェイス