オブジェクト モデルの重要な目標は、オブジェクト作成者が他のユーザーから提供されたオブジェクトを、独自の実装の一部として再利用および拡張できるようにすることです。 Microsoft Visual C++ やその他の言語でこれを行う 1 つの方法は、実装継承を使用することです。これにより、オブジェクトは別のオブジェクトから関数の一部を継承 ("サブクラス") しながら他の関数をオーバーライドできます。
従来の実装継承を使用したシステム全体のオブジェクト操作の問題は、実装階層内のオブジェクト間のコントラクト (インターフェイス) が明確に定義されていないことです。 実際には、暗黙的であいまいです。 親オブジェクトまたは子オブジェクトの実装が変更されると、関連するコンポーネントの動作が未定義または明確に実装されない可能性があります。 すべてのコンポーネントを同時に更新する単一のエンジニアリング チームが実装を管理できる単一のアプリケーションでは、これは必ずしも大きな問題であるとは限りません。 あるチームのコンポーネントが他のチームによって構築された他のコンポーネントのブラックボックス再利用によって構築される環境では、この種の不安定性は再利用を危険にさらします。 さらに、実装の継承は通常、プロセスの境界内でのみ機能します。 これにより、多くのエンジニアリング チームによって構築されたソフトウェア コンポーネントで構成される大規模で進化するシステムでは、従来の実装の継承は実用的ではありません。
再利用可能なコンポーネントを構築する鍵は、オブジェクトを不透明なボックスとして扱えるようにすることです。 つまり、別のオブジェクトを再利用しようとするコードは、使用されているコンポーネントの内部構造または実装について何も認識されず、何も知る必要はありません。 つまり、コンポーネントを再利用しようとするコードは、その正確な実装ではなく、オブジェクトの動作に依存します。
ブラックボックスの再利用性を実現するために、COM は、包含/委任や集計など、確立された他の再利用可能なメカニズムを採用しています。
注
便宜上、再利用されるオブジェクトは内部オブジェクトと呼ばれ、その 内部オブジェクト を利用するオブジェクトは外側の オブジェクトです。
これらのメカニズムの両方で、外部オブジェクトがクライアントにどのように表示されるかを覚えておく必要があります。 クライアントに関する限り、両方のオブジェクトは、クライアントがポインターを取得できるインターフェイスを実装します。 クライアントは外側のオブジェクトを不透明なボックスとして扱います。したがって、外側のオブジェクトの内部構造を気にすることも必要もありません。クライアントは動作のみを考慮します。
詳細については、次のトピックを参照してください。