(57)【特許請求の範囲】
【請求項１】
ＣＰＵ及びメモリを有するコンピュータシステムで実行される方法であって、ＣＰＵが、事前にメモリに記憶されたプログラムの命令に基づいて、囲んでいるオブジェクト内の囲まれたオブジェクトをメモリ内で集合させ、囲まれたオブジェクトは、オブジェクト管理インタフェースおよび外部インタフェースを有し、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有し、各インターフェースはインターフェースの識別子を受け取るための、及び参照を識別済のインターフェースに戻すための、質問メンバ関数を有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵが、メモリ内に囲んでいるオブジェクトのインスタンスを生成し、そして、
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵが、メモリ内に囲まれたオブジェクトのインスタンスを生成し、その際、一旦、囲まれたオブジェクトが、囲んでいるオブジェクト内に集合されると、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が、ＣＰＵによる実行に基づいて囲まれたオブジェクトの外部インタフェースの識別子を受取り、外部インタフェースへ参照を戻し、その際に、一旦、囲まれたオブジェクトが、囲んでいるオブジェクト内に集合されると、囲まれたオブジェクトの外部インタフェースの質問メンバ関数が、ＣＰＵによる実行に基づいてインタフェースの識別子を受取り、該受け取られた識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を、識別済のインタフェースに対する参照として戻す、
ステップを含む方法。
【請求項２】
前記囲まれたオブジェクトのインスタンスが集合オブジェクトであることを特徴とする請求項１記載の方法。
【請求項３】
前記囲んでいるオブジェクトのインスタンスが集合可能なオブジェクトでないことを特徴とする請求項１記載の方法。
【請求項４】
メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが、前記囲まれたオブジェクトのインスタンスの外部インタフェースに関する特定の情報を有さないことを特徴とする請求項１記載の方法。
【請求項５】
メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが、前記囲まれたオブジェクトのインスタンスの外部インタフェースに関する特定の情報を有さないことを特徴とする請求項１記載の方法。
【請求項６】
メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが、囲まれたオブジェクトのインスタンスのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、該囲まれたオブジェクトのインスタンスの外部インタフェースに対する参照を検索することを特徴とする請求項１記載の方法。
【請求項７】
メモリ内の前記囲んでいるオブジェクトのインスタンス内にＣＰＵが、囲まれたオブジェクトのインスタンスの外部インタフェースへの参照を記憶させ、メモリ内の囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが、該格納された参照を囲まれているオブジェクトのインスタンスの外部インタフェースへの参照として戻すことを特徴とする請求項１記載の方法。
【請求項８】
ＣＰＵ及びメモリを有するコンピュータシステムで実行される方法であって、ＣＰＵが、メモリ内に事前に記憶された集合可能なオブジェクトのクラス定義を実現する命令の実行に基づいてメモリ内で集合可能なオブジェクトを集合させ、
クラスはオブジェクト管理インタフェースおよび外部インタフェースを有し、該オブジェクト管理インタフェースと外部インタフェースは各インタフェースにアクセスするための質問メンバ関数を有し、当該方法が、
メモリ内に事前に記憶された作成インスタンスメンバ関数の命令を実行する時にＣＰＵが、メモリ内でクラスのオブジェクトを具体化し、
オブジェクトを集合させない場合には、メモリ内に事前に記憶された作成インスタンスメンバ関数の命令の実行に基づいてＣＰＵが、メモリ内のクラスの具体化されたオブジェクトのデータメンバ中に、メモリ内のクラスの具体化されたオブジェクトのオブジェクト管理インタフェースに対する参照を格納し、データを集合させる場合には、メモリ内のクラスの具体化されたオブジェクトのデータメンバ中に、囲んでいるオブジェクトの制御オブジェクト管理インタフェースに対する参照を格納し、
メモリ内のオブジェクト管理インタフェースの質問メンバ関数の命令を実行するときにＣＰＵが、オブジェクトのインタフェースの識別子を受取り、参照を識別されたインタフェースに戻すステップと、
メモリ内の外部インタフェースの質問メンバ関数の命令を実行するときにＣＰＵが、インターフェースの識別子を受取り、該インタフェースの識別子を渡すデータメンバによって参照を付せられたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、該呼び出された質問メンバ関数によって戻された参照を戻す、
ステップを含む方法。
【請求項９】
メモリに事前に記憶されたグローバル作成インスタンス関数の命令を実行する時にＣＰＵが、メモリ内のクラスのオブジェクトを具体化するステップを含み、
メモリに事前に記憶されたグローバル作成インスタンス関数の命令の実行に基づいてＣＰＵが作成インスタンスメンバ関数を呼び出してクラスを具体化してメモリ内にオブジェクトを生成し、メモリ内のクラスの作成されたインスタンスのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、メモリ内のクラスの作成されたインスタンスの外部インタフェースに対する参照を検索することによって、グローバル作成インスタンス関数が、メモリに事前に記憶されたクライアントの命令の実行に基づいてＣＰＵによって呼び出し可能となり、クライアントの命令を実行する時にＣＰＵがクラスのクラス定義に対するアクセスを必要とすることなく、クラスを具体化してオブジェクトを生成する、
請求項８記載の方法。
【請求項１０】
ＣＰＵ及びメモリを有するコンピュータシステム内で実行される方法であって、メモリ内に事前に記憶された命令に基づいてＣＰＵがメモリ内で集合オブジェクトを作成し、集合オブジェクトは囲まれたオブジェクトを有し、囲まれたオブジェクトは集合オブジェクトによって提示される外部インタフェースを有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてメモリ内でＣＰＵが集合オブジェクトを具体化し、集合オブジェクトの質問メンバ関数の命令に基づいてＣＰＵが集合オブジェクトによって提示されたインタフェースに対する参照を検索するために集合オブジェクトがメモリ内に質問メンバ関数の命令を有して、
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内で囲まれたオブジェクトを具体化し、囲まれたオブジェクトの質問メンバ関数の命令に基づいてＣＰＵが集合オブジェクトによって提示されたインタフェースに対する参照を検索するために、囲まれたオブジェクトが外部インタフェースの質問メンバ関数の命令をメモリ内に有し、
囲まれたオブジェクトが集合オブジェクト内に集合されたときに、メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内に囲まれたオブジェクトに対する参照を格納し、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてＣＰＵが囲まれたオブジェクトに対する格納された参照を使用し、提示された外部インタフェースに対する参照を検索し、そして、
囲まれたオブジェクトが集合オブジェクト内に集合されたときに、メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内に集合オブジェクトに対する参照を格納し、メモリ内の外部インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが集合オブジェクトに対する格納した参照を使用して、集合オブジェクトによって提示されたインタフェースに対する参照を検索する、
ステップを含む方法。
【請求項１１】
前記囲まれたオブジェクトに対する格納された参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてＣＰＵが参照されたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する、
請求項１０に記載の方法。
【請求項１２】
前記囲まれたオブジェクトに対する格納された参照が、囲まれたオブジェクトの外部インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてＣＰＵが、提示された外部インタフェースに対する参照として外部インタフェースに対する参照を使用する
請求項１０に記載の方法。
【請求項１３】
メモリ内の前記外部インタフェースの質問メンバ関数の命令の実行に基づいてＣＰＵが、格納された集合オブジェクトに対する参照を使用して、集合オブジェクトの質問メンバ関数を呼び出し、集合オブジェクトによって提示されたインタフェースに対する参照を検索する、
請求項１０に記載の方法。
【請求項１４】
格納された前記囲まれたオブジェクトに対する参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてＣＰＵが参照オブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する、
請求項１３に記載の方法。
【請求項１５】
メモリ内の前記外部インタフェースが加算参照と解放参照計数メンバ関数を有し、メモリ内の集合オブジェクトが加算参照と解放参照計数関数を有し、囲まれたオブジェクトの外部インタフェースの参照計数メンバ関数の命令の実行に基づいてＣＰＵが集合オブジェクトの参照計数メンバ関数を呼び出す、請求項１０に記載の方法。
【請求項１６】
ＣＰＵとメモリを有するコンピュータシステムで実行される方法であって、メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内の囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索するためのものであり、囲まれたオブジェクトが囲んでいるオブジェクトによって提示された外部インタフェースを有し、当該方法が、
メモリに事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内に、囲んでいるオブジェクトを具体化し、
メモリに事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内に、囲まれたオブジェクトを具体化し、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、メモリに事前に記憶されたプログラム命令に基づいてＣＰＵが囲まれたオブジェクトに対する参照を、メモリ内の囲んでいるオブジェクト内に格納し、そして、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、そして、メモリ内の囲んでいるオブジェクトの質問メンバ関数の命令を実行するときに、ＣＰＵが囲まれたオブジェクトの質問メンバ関数を呼び出し、囲まれたオブジェクトに対する格納された参照を利用して囲まれたオブジェクトの提示された外部インタフェースに対する参照を検索する、
ステップを含む方法。
【請求項１７】
ＣＰＵが、囲んでいるオブジェクトの提示されたインタフェースに対する複数の参照を反映する、メモリ内の当該囲んでいるオブジェクト内に参照カウントを維持するステップを有する請求項１６に記載の方法。
【請求項１８】
ＣＰＵとメモリを有するコンピュータシステムで実行される方法であって、メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵが囲まれたオブジェクトを、メモリ内の囲んでいるオブジェクト内に囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、質問メンバ関数が囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索するためのものであり、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内の囲んでいるオブジェクトを具体化し、
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵがメモリ内の囲まれたオブジェクトを具体化し、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵが囲んでいるオブジェクトに対する参照をメモリ内の囲まれたオブジェクト内に格納し、そして、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、そして、メモリ内の囲まれたオブジェクトの質問メンバ関数を実行するときに、ＣＰＵが、囲んでいるオブジェクトの質問メンバ関数を呼び出し、格納された囲んでいるオブジェクトに対する参照を利用して囲んでいるオブジェクトの提示されたインタフェースに対する参照を検索する、
ステップを含む方法。
【請求項１９】
メモリ内に事前に記憶されたプログラム命令に基づいてＣＰＵが、メモリ内の囲んでいるオブジェクト内に、囲んでいるオブジェクトの提示されたインタフェースに対する複数の参照を反映する参照カウントを維持するステップを有する請求項１８に記載の方法。
【請求項２０】
囲まれたオブジェクトの質問メンバ関数が、メモリ内で囲まれたオブジェクトの外部インタフェースに対応させられ、囲まれたオブジェクトが質問メンバ関数を備えたオブジェクト管理インタフェースを有し、メモリ内の囲んでいるオブジェクトの質問メンバ関数の命令の実行に応じてＣＰＵが囲まれたオブジェクトのオブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲まれたオブジェクトの外部インタフェースに対する参照を検索する、請求項１８に記載の方法。
【請求項２１】
その中に記憶された集合可能なソフトウェアオブジェクトを有するメモリであって、当該オブジェクトが、
オブジェクト管理インタフェースであって、当該オブジェクト管理インタフェースが、オブジェクトのインタフェースの識別子を受取り、インタフェースに対する参照を戻すための命令を備えた質問メンバ関数を有するオブジェクト管理インタフェースと、
外部インタフェースであって、当該外部インタフェースが、インタフェースの識別子を受取り、オブジェクトが集合されていない場合にはオブジェクト管理インタフェースの質問メンバ関数を呼び出し、オブジェクトが集合されている場合には囲んでいるオブジェクトの質問メンバ関数を呼び出し、識別されたインタフェースに対する参照を戻すための命令を備えた質問メンバ関数を有する、外部インタフェース、
を有するメモリ及び、
メモリ内で命令を実行するためのＣＰＵ、
を備えるコンピュータシステム。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、一般にコンピュータにおいてオブジェクトに対する干渉を実行する方法およびシステムに関し、特に、オブジェクトを集合させる方法に関する。
【０００２】
【従来の技術】
コンピュータソフトウェアシステムが複雑になるにつれ、ソフトウェアを開発するためのコストも増加している。ソフトウェア開発コストを最小限にするために、開発者らはコードを共用することが多い。従来の開発技術では、３つのタイプのコードを共用する。すなわち、（１）ソースコードの共用、（２）コンパイル済コードの共用、（３）継承中のコード共用、である。
ソースコードおよびコンパイル済コードを共用する方法は、長年広く使用されてきた。ソースコードの共用とは、さまざまなコンピュータプログラムまたは同一のコンピュータプログラムのさまざまなバージョンで同一のコードを使用することである。例えば、一般にスプレッドシートプログラムは、スップレッドシート表示を制御するソースコードを含む。ワードプロセッシングプログラムでスプレッドシートを文章内に埋め込むことができれば、そのワードプロセッシングプログラムは同一の（またはわずかに修正した）ソースコードを使用して、埋め込んだスプレッドシートオブジェクトを表示することができる。ソースコードは、一般に単独の開発者が複数のコンピュータプログラムを開発する際に共用される。他者と競争する関係上、開発者は他の開発者とコードを共用しない。さらに、コードを共用する場合でさえ、ソースコード受信者はソースコードを修正するのが一般的であり、この結果、ソースコードに対し２つのバージョンが維持されることになる。
【０００３】
コンパイル済コードの共用とは、さまざまなコンピュータプログラムで同一のコンパイル済コードを使用することである。一般に、コンパイル済コードは静的リンクライブラリまたは動的リンクライブラリに格納される。静的リンクライブラリに格納されたコードは、実行前にコンピュータプログラムを連係した場合に共用される。例えば、スペルチェックプログラムの開発者は、そのプログラムをコンパイルして静的リンクライブラリにコンパイル済コードを格納することによってコンパイル済コードを共用できる。その後、静的リンクライブラリをワードプロセッシングプログラム開発者に分散することによって、これらの開発者はコンパイル済スペルチェックコードをそれぞれのワードプロセッシングプログラムに連係することができる。一般に、スペルチェックプログラム開発者は、コンパイル済コード修正して、特定開発者の特殊な要求に応じなければならない。こうした修正によって、コンパイル済コードの複雑化（とサイズの増大）を助長するだけでなく、他の受信者の要求と矛盾する可能性もある。他に、開発者が、静的リンクライブラリの複数のバージョンを分散することも考えられる。しかし複数のバージョンを保守するにはコストがかかりかねない。
【０００４】
オブジェクト指向プログラミング技術には、継承という概念があり、コードの共用を許容することを意味する。この継承という概念を理解するには、一般に、オブジェクト指向プログラム技術を理解することが有益である。オブジェクト指向プログラミング言語では、データのカプセル化とデータ型の継承を支援するという２つの特徴が一般に知られている。データのカプセル化とは、関数とデータを結合させることである。継承は、あるデータ型を別のデータ型で宣言することである。
Ｃ＋＋言語では、オブジェクト指向言語をクラスを使用して支援する。クラスはユーザが定義した型である。クラスの宣言によって、クラスのデータメンバとメンバ関数が定義される。例えば、下記の宣言はCIRCLEというクラスのデータメンバとメンバ関数とを定義する。
0003672334.tif 000002
変数ｘおよびｙは、円の中心座標を指定し、変数radiusはその円の半径を指定する。これらの変数をクラスCIRCLEのデータメンバという。関数drawは、ユーザが定義した関数で、指定座標から指定した半径で円を描く。この関数drawをクラスCIRCLEのメンバ関数という。あるクラスのデータメンバとメンバ関数を結合させると、関数がクラスのインスタンスで動作する。クラスのインスタンスは、クラスのオブジェクトとも呼ばれる。
【０００５】
Ｃ＋＋の構文では、下記のステートメントが、オブジェクトａおよびｂがクラスCIRCLE型であることを宣言する。
CIRCLE a, b;
この宣言は、オブジェクトａおよびｂにメモリを割り当てる。下記のステートメントは、オブジェクトａおよびｂのデータメンバにデータを割り当てる。
a. x      =2;
a. y      =2;
a. radius =1;
b. x      =4;
b. y      =5;
b. radius =2;
下記のステートメントは、オブジェクトａおよびｂによって定義される円を描く際に用いられる。
a. draw();
b. draw();
導出クラスは、その基本クラスの特性、すなわちデータメンバとメンバ関数を継承するクラスである。例えば、下記の導出クラスCIRCLE FILLは、基本クラスCIRCLEを継承する。
【０００６】
0003672334.tif 000003
この宣言によって、クラスCIRCLE FILLが、クラスCIRCLE FILLの宣言時に導入したデータメンバとメンバ関数の他に、クラスCIRCLEに存在するすべてのデータメンバとメンバ関数、つまり、データメンバ patternとメンバ関数fillを含むことを指定する。ここでは、クラスCIRCLE FILLがデータメンバｘ、ｙ、radiusならびにメンバ関数drawおよびfillを有している。この時、クラスCIRCLE FILLは、クラスCIRCLEの特性を「継承する」と言う。他のクラスの特性を継承するクラスが、導出クラス（CIRCLE FILLなど）である。他のクラスの特性を継承しないクラスを一次クラス（ルートクラス）という（CIRCLEなど）。他クラスによって特性が継承されるクラスは、基本クラスである（例えば、CIRCLEは、CIRCLE FILLの基本クラスである）。導出クラスは、複数のクラス特性を継承することができる。つまり、導出クラスは複数の基本クラスを有することができる。これを多重継承という。
【０００７】
導出クラスは、基本クラスが仮想的に継承されるものであることを指定することができる。基本クラスの仮想継承とは、仮想基本クラスのインスタンスが導出クラス中の１つしか存在しないことを意味する。例えば、下記は非仮想基本クラスを有する導出クラスの１例である。
class CIRCLE 1 : CIRCLE  ｛ , , ,｝;
class CIRCLE 2 : CIRCLE  ｛ , , ,｝;
class PATTERN   : CIRCLE 1,  CIRCLE 2 ｛ , , ,｝;
この宣言では、クラスPATTERN は非仮想的に２度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。つまり、クラスPATTERN にはクラスCIRCLEのインスタンスが２つ存在するのである。
下記は、２つの仮想基本クラスを有する導出クラスの１例である。
class CIRCLE 1 : virtual CIRCLE  ｛ , , ,｝;
class CIRCLE 2 : virtual CIRCLE  ｛ , , ,｝;
class PATTERN   : CIRCLE 1,  CIRCLE 2 ｛ , , ,｝;
導出クラスPATTERN は、仮想的に２度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。クラスCIRCLEは、２度仮想的に継承されるので、導出クラスPATTERN には、クラスCIRCLEのオブジェクトが１つしか存在しないことになる。クラス導出が複雑な場合に、仮想継承が非常に有益であると評価する当業者もいるであろう。
【０００８】
クラスは、そのメンバ関数仮想的であるかどうかによっても指定することができる。あるメンバ関数が仮想的であると宣言することは、その関数が導出クラスにおいて同一名および同一型の関数によって優先され得ることを意味する。下記の例では、関数drawをクラスCIRCLEとCIRCLE FILLで仮想的であると宣言している。
0003672334.tif 000004
Ｃ言語は、ポインタデータ型を提供する。ポインタはメモリ中のオブジェクトのアドレス値を保持する。ポインタを介在に、オブジェクトに参照を付することができる。下記のステートメントは、変数 c ptr がクラスCIRCLE型のオブジェクトのポインタであることを宣言し、変数 c ptr をセットしてオブジェクトのアドレスを保持する。
【０００９】
CIRCLE *c ptr
c ptr = &c;
この例に続き、下記のステートメントは、オブジェクトａがクラスCIRCLE型であり、オブジェクトｂがクラスCIRCLE FILL型であることを宣言する。
CIRCLE  a ;
CIRCLE FILL b;
下記のステートメントは、クラスCIRCLEで定義したように、関数drawに適用される。
a. draw() ;
一方、下記のステートメントは、クラスCIRCLE FILLで定義した関数drawに適用される。
b. draw() ;
さらに、下記のステートメントは、キャストオブジェクトｂをクラスCIRCLE型のオブジェクトに分類し、クラスCIRCLE FILLで定義した関数drawを呼び出す。
CIRCLE *c ptr;
c ptr = &b;
c ptr->draw() ;    //   CIRCLE FILL :: draw()
このため、呼び出される仮想関数は、CIRCLE FILL::drawである。
【００１０】
図１は、オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。オブジェクトはインスタンスデータ（データメンバ）およびメンバ関数であり、オブジェクトを実際に動作させる。オブジェクトの表現に使用するデータ構造は、インスタンスデータ構造１０１と、仮想関数表１０２と、メンバ関数１０３、１０４および１０５から成る。インスタンスデータ構造１０１は、仮想関数表１０２に対するポインタとデータメンバを含む。仮想関数表１０２は、オブジェクトに対して定義した各仮想メンバ関数のエントリを含む。各エントリは、対応するメンバ関数を提供するコードへの参照を含む。このサンプルオブジェクトのレイアウトは、米国特許出願第07／682,537 号「A Methodfor Implementing Virtual Function and Virtual Bases in a Compiler for anObject Oriented Programming Language」に従っており、本明細書中に参照として取り入れた。以下において、オブジェクトを、Ｃ＋＋プログラミング言語で定義したクラスのインスタンスとして述べる。当業者には、オブジェクトは他のプログラミング言語を使用して定義できると評価するものもいる。
クラスの継承は、コード共用の１形式である。クラス開発者は、他の開発者にクラスの処理系を提供することができる。この他の開発者は、提供されたクラスから導出するクラスを作成することができる。ただし、クラスが継承されて、仮想関数が優先される場合は、優先する仮想関数のテストは複雑になることが考えられる。優先仮想関数は、非優先関数に影響を与えながら、オブジェクトの状態を修正する。このため、各継承関数は、優先仮想関数のテストと同時に独立したテストをする必要がある。テストの複雑さを改善するには、クラス処理系の開発者は処理系でソースコードを分散することができる。残念ながら、ソースコードを分散すると、上述のように、共用ソースコードに同様の支障が生じる。
【００１１】
オブジェクト指向技術の利点は、オブジェクトの共用を容易にできることである。特に、オブジェクト指向技術は複合文書の作成を容易にする。複合文書は、さまざまなコンピュータプログラムによって生成されたオブジェクトを含む文書である。（一般に、オブジェクトのデータメンバとクラス型のみが複合文書に格納される。）例えば、スプレッドシートプログラムで生成したスプレッドシートオブジェクトを含むワードプロセッシング文書は、複合文書である。ワードプロセッシングプログラムでは、ユーザは（セルなど）スプレッドシートをワードプロセッシング文書内に埋め込むことができる。この埋め込みは、ワードプロセッシングプログラムを、埋め込むべきオブジェクトのクラス定義を使用して埋め込んだオブジェクトのメンバ関数にアクセスして、コンパイルすることによって可能となる。このため、ワードプロセッシングプログラムは、ワードプロセッシング文書に埋め込むことができるオブジェクトの各クラスのクラス定義を使用してコンパイルしなければならないだろう。新しいクラスのオブジェクトをワードプロセッシング文書に埋め込むには、ワードプロセッシングプログラムは新たなクラス定義でリコンパイルしなければならないと考えられる。このため、ワードプロセッシングプログラムの開発者が選択したクラスオブジェクトだけを埋め込むことができる。さらに、新たなクラスをワードプロセッシングプログラムを新たにリリースしてのみ支援することができる。
【００１２】
任意クラスのオブジェクトを複合文書に埋め込むには、どうすればオブジェクトをワードプロセッシングプログラムがコンパイル時間にクラス定義にアクセスする必要なしにアクセスできるかで、インタフェースを定義する。抽象クラスは仮想メンバ関数が処理系を持たない（純粋な）クラスである。インタフェースはデータメンバがない抽象クラスであり、その仮想関数はすべて純粋である。
以下のクラス定義は、インタフェースの定義の一例である。この例では、説明を簡略にするために、オブジェクトのクラスを問わず文書に埋め込ませるより、むしろ、ワードプロセッシングプログラムでスプレッドシートオブジェクトを埋め込ませている。オブジェクトがどのように処理されたかを問わず、このインタフェースを提供するスプレッドシートはすべて埋め込むことができる。さらに、ワードプロセッシングプログラムをコンパイルする前あるいは後に処理されたかに関係なく、スプレッドシートを問わず埋め込むことができる。
0003672334.tif 000005
スプヘレッドシートプログラムの開発者は、インタフェースの処理系を供給して、スプレッドシートオブジェクトをワードプロセッシング文書に埋め込ませる必要があるだろう。ワードプロセッシングプログラムによってスプレッドシートオブジェクトを埋め込ませる場合、そのプログラムはスプレッドシートオブジェクトに対するインタフェースを実現するコードにアクセスしなければならない。そのコードにアクセスするために、各処理系には独特のクラス識別子が与えられる。例えば、Microsoft Corporation が開発したスプレッドシートオブジェクトは、「MSSpreadsheet 」というクラス識別子を有することができる。また、他社開発のスプレッドシートオブジェクトは、「LTSSpreadsheet」という識別子を有することができる。各コンピュータシステムでは常駐登録簿を維持して、各クラス識別子をクラスを実現するコードにマップする。一般に、スプレッドシートプログラムがコンピュータシステムにインストールされると、常駐登録簿を更新し、スプレッドシートオブジェクトのクラスの可用性を反映する。スプレッドシート開発者がインタフェースによって定義した各メンバ関数を処理し常駐登録簿を維持する限り、ワードプロセッシングプログラムは開発者のスプレッドシートオブジェクトをワードプロセッシング文書に埋め込むことができる。
【００１３】
しかし、さまざまなスプレッドシート開発者が特定のメンバ関数のみ実行したいと願っていることだろう。例えば、あるスプレッドシート開発者はデータベース支援を実行したくないが、その他のメンバ関数は支援したいと考えているかもしれない。オブジェクトを埋め込むことができる上に、スプレッドシートの開発者がメンバ関数の一部のみを支援できるようにするには、スプレッドシートオブジェクトに対して複数のインタフェースを定義する。インタフェースIDatabase およびIBasicなどを、下記のようにスプレッドシートに定義することができる。
0003672334.tif 000006
各スプレッドシート開発者らはIBasicインタフェースを、選択的にIDatabase を実行したいと考えるであろう。
【００１４】
実行時において、ワードプロセッシングプログラムは埋め込むべきスプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを決定しなくてはならなくなる。この決定の際に、別のインタフェースをどのインタフェースをオブジェクトに埋め込むことができるかを指示するメンバ関数を用いて（すべてのスプレッドシートオブジェクトが実行することを）定義する。このインタフェースはIUnknownという名で、（未確認インタフェースあるいはオブジェクト管理インタフェースと呼ばれ、）下記のように定義される。
0003672334.tif 000007
このIUnknownインタフェースは、メンバ関数（メソッド）QueryInterfaceを定義する。メソッドQueryInterfaceは、（REFIID型の）パラメータiid 中の（IDatabase などの）インタフェース識別子に渡されて、ポインタをこのメソッドがパラメータppv に呼び出されるオブジェクト用に識別したインタフェースの処理系に戻す。このオブジェクトがインタフェースを支援しなければ、このメソッドは偽に戻る。
【００１５】
0003672334.tif 000008
コード表１は、クラスXX対応のメソッドQueryInterfaceの一般的な処理系に対するＣ＋＋のソースコードを含み、クラスIUnknownを継承する。スプレッドシートオブジェクトがIDatabase インタフェースを支援する場合、メソッドQueryInterfaceはswitch文内に適切なcaseラベルを含む。変数pIBasic とpIDatabaseは、ポインタをIBasicインタフェースとIDatabase インタフェースの仮想関数表へそれぞれポイントする。インタフェースへのポインタが戻されると、メソッドQueryInterfaceは（以下の) メソッドAddRefを呼び出し、クラスXXのオブジェクトに対する参照カウント値をインクリメントする。
【００１６】
0003672334.tif 000009
インタフェースIUnknownは、メソッドAddRefおよびRelease も定義する。これらは、参照カウントの実行に使用される。インタフェースに対し新たな参照を作成する度に、メソッドAddRefを呼び出し、オブジェクトの参照カウント値をインクリメントする。参照が不要になる度に、メソッドRelease を呼び出し、オブジェクトの参照値をディクリメントし、参照値が０になった場合にはオブジェクトの割当てを解除する。コード表２は、クラスXXに対応するメソッドAddRefおよびRelease の一般的な処理系に対するＣ＋＋のソースコードを含み、クラスIUnknownを継承する。
IDatabase インタフェースとIBasicインタフェースはIUnknownインタフェースを継承する。下記の定義は、IUnknownインタフェースの使用法を示す。
0003672334.tif 000010
図２は、スプレッドオブジェクトのサンプルデータ構造を示すブロック図である。このスプレッドオブジェクトは、オブジェクトデータ構造２０１と、IBasicインタフェースデータ構造２０４と、仮想関数表２０２、２０５および２０６と、メソッド２０７乃至２２１とを含む。オブジェクトデータ構造２０１は、仮想関数表２０２に対するポインタとIBasicインタフェースおよびIDatabase インタフェースに対するポインタとを含む。仮想関数表２０２の各エントリは、IUnknownインタフェースのメソッドへのポインタを含む。IBasicインタフェースデータ構造２０３は、仮想関数表２０５へのポインタを含む。仮想関数表２０５の各エントリは、IBasicインタフェースのメソッドに対するポインタを含む。IDatabase インタフェース構造２０４は、仮想関数表２０６に対するポインタを含む。仮想関数表２０７の各エントリは、IBasicインタフェースのメソッドのポインタを含む。IBasicインタフェースおよびIDatabase インタフェースは、IUnknownインタフェースを継承し、仮想関数表２０５および２０６は、メソッドQueryInterface、AddRefおよびRelease を各々含む。下記において、オブジェクトデータ構造は、オブジェクトがアクセスできるインタフェースでラベル付けした形式２２２によって表わされる。
【００１７】
下記の擬似コードでは、ワードプロセッシングプログラムが、スプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを定義する方法を示す。
0003672334.tif 000011
ポインタ pIBasicは、オブジェクトのIBasicインタフェースに対するポインタである。このオブジェクトがIDatabase インタフェースを支援する場合は、メソッドQueryInterfaceはポインタpIDatabaseをセットし、IDatabase データ構造にポイントして、その値通り真に戻る。
通常、オブジェクトを変数宜言または「新たな」オペレータによって具体化することができる（メモリ内に作成したオブジェクトのインスタンス）。ただし、どちらの実現化技術でも、実行時にワードプロセッシングプログラムにスプレッドオブジェクトを実現化させる必要がある。広域関数CreateInstanceXXを供給する技術もあり、下記のように定義される。
【００１８】
static void CreateInstanceXX(REFIID iid, void**ppv) = 0 ;
メソッドCreateInstanceXXは、クラスXXのオブジェクトを実現化し、ポインタppv をパラメータiid によって定義したオブジェクトのインタフェースに戻す。
【００１９】
【発明が解決しようとする課題】
上述のように、従来の技術では、ソフトウェアの開発者らが所望のコードを共用する際にその手続きが複雑になるという欠点があった。
したがって、本発明の目的は、オブジェクトを集合させるための方法とそのシステムを提供することにある。
本発明の別の目的は、オブジェクトを別のオブジェクト内に囲む一方、囲まれたオブジェクトのインタフェースを、囲んでいるオブジェクトのクライアントに提示する方法とそのシステムを提供することにある。
また、本発明の別の目的は、別のオブジェクト内に囲むことができるか、オブジェクトの処理系を修正せずには別のオブジェクト内に囲むことができないオブジェクトを実現するための方法およびシステムを提供することにある。
さらに、本発明の別の目的は、集合オブジェクトを実現し、クライアントがオブジェクトが集合体であることを意識させないための方法およびシステムを提供することにある。
本発明のもっと別な目的は、オブジェクトを囲むことによって、囲まれたオブジェクト自体が、任意のレベルの囲いに対して囲いをするオブジェクトと成りうる方法およびシステムを提供することにある。
【００２０】
上記の目的を含めた他の目的は、本発明の以下の記載で明らかなように、コンピュータシステム内でオブジェクトを集合させる方法およびシステムによって提供される。本発明の方法は、囲まれたオブジェクトを、囲んでいるオブジェクト内に集合させることが好ましい。この囲まれたオブジェクトは、オブジェクト管理インタフェースと１以上の外部インタフェースを有し、これを囲むオブジェクトが制御オブジェクト管理インタフェースを有する。集合オブジェクトによってクライアントに提示した各インタフェースは、質問メンバ関数を有しインタフェースの識別子を受取って、識別済のインタフェースに参照を戻す。囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数は、囲んでいるオブジェクトによって提示されたインタフェースの識別子を受取り、提示したインタフェースに参照を戻す。本発明の好ましい方法では、囲まれたオブジェクトのインスタンスを作成する。囲まれたオブジェクトの提示したインタフェースの質問メンバ関数は、インタフェースの識別子を受取り、受け取った識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、さらに、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済インタフェースの参照として戻す。
【００２１】
本発明では、囲まれたオブジェクトの質問メンバ関数は、囲まれたオブジェクトの外部インタフェースの知識を用いて実現され、囲んでいるオブジェクトまたは他の囲まれたオブジェクトの（制御オブジェクト管理インタフェース以外の）インタフェースの知識を有さないのが好ましい。
【００２２】
【課題を解決するための手段】
上記目的を達成するために、本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトは、オブジェクト管理インタフェースおよび外部インタフェースを有し、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有し、各インタフェースは、インタフェースの識別子を受け取るための質問メンバ関数と識別済のインタフェースに参照を戻すことによって、コンピュータシステム内で、前記囲まれるオブジェクトを前記囲んでいるオブジェクト内に集合させるためのオブジェクト集合方法において、囲んでいるオブジェクトのインタフェースを作成することによって、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースの識別子を受取り、外部インタフェースへ参照を戻すステップと、囲まれたオブジェクトのインスタンスを作成して、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、該受け取られた識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースのメンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済のインタフェースに対する参照として戻すステップと、を有することを特徴とする。
【００２３】
このため、本発明のオブジェクト集合方法およびシステムは、前記オブジェクトが集合オブジェクトであることを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記集合オブジェクトが集合可能なオブジェクトでないことを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該囲まれたオブジェクトの外部インタフェースに関し、特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースに関する特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、該囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトが囲まれているオブジェクトの外部インタフェースを格納して、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該格納された参照を囲まれたオブジェクトの外部インタフェースとして戻す。
【００２４】
本発明のオブジェクトの集合方法およびシステムは、クラスはオブジェクト管理インタフェースおよび外部インタフェースを有し、該オブジェクト管理インタフェースと外部インタフェースは各インタフェースにアクセスするための質問メンバ関数を有し、集合オブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクト集合方法およびシステムにおいて、作成インスタンスメンバ関数を生成しクラスのオブジェクトを具体化し、作成インスタンスメンバ関数がオブジェクトを集合させない場合にはクラスのデータメンバ中にクラスのオブジェクト管理インタフェースに対する参照を格納し、データを集合させる場合にはクラスのデータメンバ中に囲んでいるオブジェクトの制御オブジェクト管理インタフェースに対する参照を格納するステップと、オブジェクト管理インタフェースの質問メンバ関数を生成することによって、質問メンバ関数がインタフェースの識別子を受取り、識別されたインタフェースに対して参照を戻すステップと、外部インタフェースの質問メンバ関数を生成して、質問メンバ関数がインタフェースの識別子を受取り、該インタフェースの識別子を渡すデータメンバによって参照を付せられたオブジェクト管理インタフェースを呼び出し、該呼び出された質問メンバ関数によって戻される参照を戻すステップと、を有する。
【００２５】
本発明のオブジェクト集合方法およびシステムは、クラスのオブジェクトを実現化するためのグローバル作成インスタンス関数を生成し、グローバル作成インスタンス関数が作成インスタンスメンバ関数を呼び出しクラスのインスタンスを作成し、かつ、オブジェクト管理インタフェースから質問メンバ関数を呼び出しクラスの外部インタフェースに対する参照を検索することによって、グローバル作成インスタンス関数をクライアントによって呼び出し、クライアントがクラスに対するクラス定義にアクセスする必要なく、クラスのインスタンスを作成するステップを有する。
本発明のオブジェクトの集合方法およびシステムは、集合オブジェクトを作成し、集合オブジェクトは囲まれたオブジェクトを有し、囲まれたオブジェクトは集合体によって提示される外部インタフェースを有するオブジェクト集合方法およびシステムにおいて、集合オブジェクトを具体化し、集合オブジェクトが質問メンバ関数を有して、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトを具体化し、囲まれたオブジェクトが外部インタフェースの質問メンバ関数を有し、集合オブジェクトによって指示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトに対する参照を格納し、集合オブジェクトの質問メンバ関数は囲まれたオブジェクトに対して格納した参照を使用し、提示された外部インタフェースに対する参照を検索するステップと、集合オブジェクトに対する参照を格納し、外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、を有する。
【００２６】
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照されたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照は、囲まれたオブジェクトの外部インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数は、外部インタフェースに対する参照を提示された外部インタフェースに対する参照として使用するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を使用し、集合オブジェクトの質問メンバ関数を呼び出し、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照オブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する。
【００２７】
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースが加算参照を供給し、参照計数メンバ関数を解放し、集合オブジェクトが加算参照を供給し参照計数関数を解放し、囲まれたオブジェクトの外部インタフェースの参照計数メンバ関数が集合オブジェクトの参照計数メンバ関数を呼び出すステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲んでいるオブジェクト内に囲まれたオブジェクトに対する参照を格納するステップとを有し、囲んでいるオブジェクトの質問メンバ関数を実行する場合に、囲まれたオブジェクトの質問メンバ関数を呼び出し、囲まれたオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示された外部インタフェースに対する参照を検索する。
【００２８】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲まれたオブジェクト内に囲んでいるオブジェクトに対する参照を格納するステップとを有し、囲まれたオブジェクトの質問メンバ関数を実行する場合に、囲んでいるオブジェクトの質問メンバ関数を呼び出し、囲んでいるオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示されたインタフェースに対する参照を検索する。
【００２９】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトの質問メンバ関数を囲まれたオブジェクトの外部インタフェースに対応させ、囲まれたオブジェクトが質問メンバ関数を備えたオブジェクト管理インタフェースを有し、囲んでいるオブジェクトの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースに質問メンバ関数を呼び出し、囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステム集合オブジェクトが囲まれるオブジェクトと囲んでいるオブジェクトを有し、囲んでいるオブジェクトが参照カウントと加算参照メンバ関数と解放メンバ関数とを有し、囲まれたオブジェクトが加算参照メンバ関数と解放参照メンバ関数とを有し、集合オブジェクトに対して参照の計数を行なうオブジェクト集合方法およびシステムにおいて、囲まれたオブジェクトの加算参照メンバ関数の制御下で、囲んでいるオブジェクトの加算メンバ関数を呼び出し、囲んでいるオブジェクトの加算参照メンバ関数が参照カウントをインクリメントするステップと、囲まれたオブジェクトの解放参照メンバ関数の制御下で、囲いでいるオブジェクトの解放参照メンバ関数を呼び出し、囲んでいるオブジェクトの解放参照メンバ関数が参照カウントをディクリメントするステップと、を有する。
【００３０】
本発明のオブジェクト集合方法およびシステムは、参照カウントが集合オブジェクトに対する参照が存在しないことを示した場合、囲んでいるオブジェクトと囲まれたオブジェクトを削除する。
本発明のオブジェクト集合方法およびシステムは、クラスがオブジェクト管理インタフェースと外部インタフェースとを有し、オブジェクト管理インタフェースと外部インタフェースがそれぞれ質問メンバ関数を有して、集合可能なオブジェクトのインタフェースにアクセスし、集合可能なオブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクトの集合方法およびシステムにおいて、外部インタフェースを定義するステップと、集合可能なクラスを定義し、集合可能なクラスが定義された外部インタフェースを基本クラスとして継承し、集合クラスが定義された外部インタフェースの質問メンバ関数の処理系を有し、オブジェクトを集合させていない場合には、定義された外部インタフェースの質問メンバ関数がオブジェクト管理インタフェースを呼び出し、集合可能なオブジェクトを集合させている場合には、集合しているオブジェクトの質問メンバ関数を呼び出すことを特徴とするステップと、を有する。
【００３１】
本発明のオブジェクトの集合方法およびシステムは、コンピュータシステムの集合オブジェクトが、オブジェクトのインタフェースの識別子を受取り、インタフェースに対して参照を戻すための質問メンバ関数を有するオブジェクト管理インタフェースと、インタフェースの識別子を受取り、オブジェクトを集合させていない場合にはオブジェクト管理インタフェースの質問メンバ関数が呼び出し、オブジェクトを集合させている場合には、囲んでいるオブジェクトの質問メンバ関数を呼び出し、識別されたインタフェースに対する参照を戻すための質問メンバ関数を有する外部インタフェースと、を含む。
【００３２】
【実施例】
本発明は、コンピュータシステムにおいてオブジェクトを集合させる方法を提供する。態様としては、集合オブジェクトがそのクライアントに複数のインタフェースを供給することが好ましい。オブジェクトを具体化するコンピュータプログラムをクライアントと呼ぶ。集合オブジェクトは、１つ以上の囲まれたオブジェクトとIUnknownインタフェースの処理系とからなり、この処理系を集合オブジェクトの制御IUnknownインタフェースと呼ぶ。集合オブジェクトは、そのクライアントにそれ自体のインタフェースと囲まれたオブジェクトからのインタフェースを提示する。制御IUnknownインタフェースのメソッドQueryInterfaceはポインタを集合オブジェクトによって提示された各インタフェースに戻す。集合オブジェクトは各囲まれたオブジェクトを具体化する。この具体化は、集合オブジェクトの構成を通じてできるし、囲まれたオブジェクトのインタフェースが必要になるまで延期することもできる。各囲まれたオブジェクトは、制御IUnknownインタフェースに対するポインタを含む。囲まれたオブジェクトの提示したインタフェースのメソッドQueryInterfaceは、IUnknownインタフェースのメソッドQueryInterfaceの呼び出しを実現できることが好ましい。囲まれたオブジェクトを実現した場合、一般に開発者らは囲んでいるオブジェクトがどのインタフェースを提示するかについての知識はない。結果的に、囲まれたオブジェクトのメソッドQueryInterfaceが制御IUnknownインタフェースを呼び出して、要求したインタフェースのポインタを検索する。制御IUnknownインタフェースのメソッドQueryInterfaceは、一般に提示したすべてのインタフェースの知識をもって実現される。オブジェクトが囲まれていない場合、制御IUnknownインタフェースは、そのオブジェクトのIUnknownインタフェースであり。逆に、オブジェクトが囲まれている場合は、制御IUnknownインタフェースは囲んでいるオブジェクトのIUnknownインタフェースである。
【００３３】
本発明では、集合オブジェクトが参照カウントを維持することが好ましい。集合オブジェクトを具体化した場合、その参照カウントは１にセットされる。制御IUnknownのメソッドQueryInterfaceは、参照がクライアントに戻されると、参照カウントをインクリメントする。囲まれたオブジェクトの提示されたインタフェースのメソッドAddRefは、制御IUnknownインタフェースのメソッドAddRefを呼び出し、集合オブジェクトの参照カウントをインクリメントする。同様に囲まれたオブジェクトの提示されたインタフェースのメソッドRelease は、制御IUnknownインタフェースのRelease を呼び出し、集合オブジェクトの参照カウントをディクリメントし、参照カウントが０ならば集合オブジェクトを削除する。囲まれたオブジェクトを具体化した場合、囲まれたオブジェクトの参照カウントは０にセットされる。集合オブジェクトが削除された場合、各囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、囲まれたオブジェクトを消去する。
本発明によるオブジェクト集合方法およびシステムは、中央演算処理装置（ＣＰＵ）、メモリおよび入出力装置を含むコンピュータで実行されることが好ましい。
【００３４】
図３は、集合オブジェクトを示すブロック図である。集合オブジェクトＳ３はインタフェースＡ、Ｂ、ＣおよびＦならびに制御IUnknownを提示する。（囲んでいる）集合オブジェクトＳ３は、囲まれたオブジェクトＳ１・３０３、囲まれたオブジェクトＳ２・３０２、処理系Ｉ３・３０４とを含む。囲まれたオブジェクトＳ１は外部インタフェースＣおよびＤを実現し、囲まれたオブジェクトＳ２は外部インタフェースＥおよびＦを実現する。（外部インタフェースは、囲んでいるオブジェクトによって提示できるオブジェクトのインタフェースである。内部インタフェースは囲んでいるオブジェクトによっては提示できないオブジェクトのインタフェースである。）処理系Ｉ３は外部インタフェースＡおよびＢと、制御IUnknownを実現する。集合オブジェクトＳ３のクライアントは、オブジェクトが集合体であることを意識する必要はない。集合オブジェクトＳ３は、オブジェクトＳ１およびＳ２を集合オブジェクトＳ３の構成中またはそれより遅い時間に具体化する。処理系Ｓ３は、オブジェクトＳ１およびＳ２のIUnknownインタフェースに対するポインタを含む。オブジェクトＳ１およびＳ２は、初期化されて制御IUnknownインタフェースに対するポインタを含む。
【００３５】
提示されたインタフェースのメソッドQueryInterfaceは、ポインタを提示された各インタフェースに戻し、ポインタが戻されたときに集合オブジェクトの参照カウントをインクリメントすることができる。制御IUnknownのメソッドQueryInterfaceは、処理系Ｉ３を実現し、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して、囲まれたオブジェクトＳ１およびＳ２の提示されたインタフェース−−ＣおよびＦ−−に対するポインタを検索するインタフェース−−Ａ、Ｂおよび制御IUnknown−−に対するポインタに直接アクセスする。囲まれたインタフェースに対するポインタを戻すと、制御IUnknownインタフェースのメソッドQueryInterfaceは、制御IUnknownインタフェースのメソッドAddRefを呼び出すことによって、集合オブジェクトＳ３の参照カウントをインクリメントする。（制御IUnknownインタフェース以外の）各提示されたインタフェースのQueryInterfaceは、制御IUnknownインタフェースのメソッドQueryInterfaceを呼び出すことが好ましい。
0003672334.tif 000012
0003672334.tif 000013
0003672334.tif 000014
コード表３オブジェクトＳ１のＣ＋＋クラス定義を含み、オブジェクトのインスタンスを作成するグローバル関数を加えて集合体（集合オブジェクト）を囲むことができる。IUnknown、ICおよびIDは、各インタフェースのメソッドを定義するインタフェースである。クラスＳ１は、IUnknownインタフェース、ICインタフェースおよびIDインタフェースを実現する。クラスＳ１は、ICインタフェースおよびIDインタフェースを外部インタフェースとして実現する。図４は、クラスＳ１のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。インスタンス構造４０１はクラスＳ１のデータメンバ（ m C 、 m D 、 m punkOuter 、 m refcount）とポインタ、ここでは仮想関数表ポインタ（S1::vfptr)を含む。データメンバ m C および m D は、それぞれクラスＣおよびＤのオブジェクトのインスタンスである。クラスＣおよびクラスＤはクラスＳ１を支援し、オブジェクトＣおよびＤはクラスＳ１の私的メンバにアクセスすることができる。仮想関数表ポインタS1::vfptr は、仮想関数表４０２をポイントし、データメンバ内の仮想関数ポインタ m C S1::C::vfptrは仮想関数表４０３をポイントし、さらにデータメンバ内の仮想関数表ポインタ m D S1::D::vfptrは、仮想関数表４０３Ａをポイントする。仮想関数表４０２は、IUnknownインタフェース用に定義した仮想関数に対するポインタを含み、仮想関数表４０３は、Ｃインタフェース用に定義した仮想関数に対するポインタを含み、仮想関数表４０３ＡをインタフェースＤ用に定義した仮想関数に対するポインタを含む。仮想関数表４０３および４０３Ａ内の省略部分はクラスＣおよびＤの付加的な関数に対するポインタをそれぞれ示している。関数４０４乃至４０８は、クラスＳ１のメンバ関数である。関数４０７は、クラスＳ１の構成子である。関数４０８は、クラスＳ１の関数CreateInstanceである。関数４０９乃至４１２は、クラスＣのメンバ関数である。関数４１２は、クラスＣの構成子である。関数４１３乃至４１６は、クラスＤのメンバ関数である。関数４１６は、クラスＤの構成子である。
【００３６】
コード表３に示したように、メソッドS1::QueryInterfaceはインタフェースＣ、インタフェースＤまたはインタフェースIUnknownに対するポインタを戻し、メソッドS1::AddRefを呼び出し、オブジェクトＳ１の参照カウントをインクリメントする。メソッドS1::AddRefは参照カウントをインクリメントして、メソッドS1::Release は参照カウントをディクリメントし、参照カウントが０になった場合はオブジェクトＳ１を削除する。
グローバル関数CreateInstanceS1は、クラスオブジェクトＳ１のインスタンスを作成する。クライアントがこの関数を呼び出し、クラスオブジェクトＳ１を具体化する。このため、クライアントは、コンパイル時間または実行時にクラスＳ１の定義にアクセスせずに、クラスＳ１のオブジェクトを具体化できる。具体化したオブジェクトＳ１が集合オブジェクトおよびインタフェースの識別子iid 内に囲まれて戻る場合、関数CreateInstanceS1は、制御IUnknown（punkOuter)に対するポインタに渡される。関数CreateInstanceS1は、識別されたインタフェースに対するポインタ（ppv)を戻す。関数CreateInstanceS1は、パラメータpunkOuter を渡しながら、メソッドS1::CreateInstanceを呼び出す。メソッドS1::CreateInstanceは、オブジェクトＳ１を具体化し、オブジェクトＳ１のIUnknownインタフェースに対するポインタ（punk) を戻す。関数CreateInstanceS1は、オブジェクトＳ１のメソッドQueryInterfaceを呼び出し、識別されたインタフェースに対するポインタを検索する。関数CreateInstanceS1は、オブジェクトＳ１のメソッドRelease を呼び出すが、これは、一時ポインタpunkが必要となくなったからである。
メソッドS1::CreateInstanceはオブジェクトＳ１を具体化し、オブジェクトＳ１のIUnknownインタフェースに対するポインタ（ppunk)を戻す。メソッドS1::CreateInstanceは、制御IUnknownに対するポインタ（punkOuter)に渡される。メソッドS1::CreateInstanceは新たにオペレータを使用して、オブジェクトＳ１を具体化する。具体化している間に、構成子S1::S1を呼び出し、パラメータpunkOuter の値に渡す。オブジェクトＳ１が構成された後、メソッドCreateInstanceは、メソッドS1::QueryInterfaceを呼び出し、オブジェクトＳ１のIUnknownインタフェースに対するポインタを検索する。
【００３７】
構成子S1::S1は、データメンバ m C 、 m D 、 m punkOuter および m refcountを初期化する。構成子S1::S1は、パラメータpunkOuter に渡される。データメンバ m C および m D の具体化中、構成子C::CおよびD::Dを呼び出し、オブジェクトＳ１に対するポインタthisに渡す。パラメータpunkOuter の値がNULLであれば、構成子S1::S1はデータメンバ m punkOuter をポインタthisの値にセットする（このポインタは、新たに具体化したオブジェクトＳ１をポイントする）。パラメータpunkOuter の値がNULLでなければ、構成子S1::S1は、データメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトＳ１が囲まれている場合には、集合体の制御IUnknownの値をポイントし、オブジェクトＳ１が囲まれていない場合には、オブジェクトＳ１の制御IUnknownをポイントする。構成子S1::S1は、データメンバ m fercountをゼロに初期化もする。
構成子C::Cは、オブジェクトＳ１に対するポインタに渡される。構成子C1::C1は、渡されたポインタをC::m pS1 内に格納する。データメンバC::m pS1 は、クラスＣのメソッドによって使用され、データメンバS1:: m punkOuter にアクセスする。
【００３８】
メソッドC::QueryInterface 、C::AddRef およびC::Releaseは、データメンバS1:: m punkOuter によってポイントされるIUnknownインタフェースの中で対応するメソッドを呼び出し、これによってオブジェクトＳ１が囲まれている場合には、集合体の制御IUnknownInterface にポイントする。
クラスＤの構成子およびその他のメソッドはクラスＣの構成子およびその他のメソッドに類似している。
図４は、集合体の部分以外のオブジェクトＳ１のインスタンスである。データメンバS1::C::m pS1 、S1::D::m pS1 および S1::m punkOuter は、オブジェクトＳ１自体に対するポインタに初期化される。データメンバ m C およびm  D のメソッドQueryInterface、AddRefおよびRelease は、オブジェクトＳ１のインタフェースのIUnknownメソッドを呼び出す。
インタフェースＥおよびＦを実現するオブジェクトＳ２は、上述のオブジェクトＳ２と類似している。
0003672334.tif 000015
0003672334.tif 000016
virtual boolean QueryInterface(REFIID iid, void **ppv)｛return m pS3->m punkOuter->QueryInterface(iid,ppv); ｝      virtual void AddRef() ｛ m pS3->m punkOuter->Release(); ｝＼＼ other methods of IB       private:                S3       *m pS3 ; ｝;        friend B ;        B       m B ; public:        virtual boolean QueryInterface(REFIID iid, void **ppv) ｛     ret = TRUE;                       switch(iid)｛case IID C :                              ret = m punkS1->QueryInterface(iid,ppv) ;                              break;                         case IID F :                              ret = m punkS2->QueryInterface(iid,ppv) ;                              break;                         case IID A:                             *ppv = &m A;                           m punkOuter->AddRef() ;                             break;                        case IID B:                             *ppv = &m B;                           m punkOuter->AddRef() ;                             break;                        case IID IUnknown:
0003672334.tif 000017
コード表４は、集合オブジェクトのＣ＋＋クラス定義である。クラスＳ３は、インタフェースIUnknownＡ、Ｂ、ＣおよびＦを提示する。インタフェースＣを提供するために、クラスＳ３は、オブジェクトＳ１を囲み、インタフェースＣを提示する。インタフェースＦを供給するために、クラスＳ３は、オブジェクトＳ２を囲み、インタフェースＦを提示する。オブジェクトＳ３は、インタフェースＣおよびＦに対するポインタを制御IUnknownインタフェースのメソッドQueryInterfaceを介して戻すことによってインタフェースＣおよびＦを提示する。オブジェクトＳ１のインタフェースＤおよびオブジェクトＳ２のインタフェースＥは、外部インタフェースであるが、オブジェクトＳ３はこれらのインタフェースを提示しない。
【００３９】
メソッドS3::QueryInterface、S3::AddRefおよびS3::Release は、集合体の制御IUnknownインタフェースを構成する。メソッドS3::QueryInterfaceは、制御IUnknownインタフェースＡ、Ｂ、ＣまたはＦに対するポインタを戻し、オブジェクトＳ３に対する参照カウントをインクリメントする。メソッドS3::AddRefは、参照カウントをインクリメントし、メソッドS3::Release は参照カウントをディクリメントし参照カウントが０になるとオブジェクトＳ３を削除する。
グローバル関数CreateInstanceS3は、クラスＳ３のオブジェクトのインスタンスを作成する。クライアントは、この関数を呼び出して、クラス３のオブジェクトを具体化する。このため、クライアントは、コンパイル時および実行時においてクラスＳ３の定義にアクセスせずにクラスＳ３のオブジェクトを具体化することができる。具体化されたオブジェクトＳ３が集合オブジェクトおよびクラスＳ３によって提示されたインタフェースの識別子（iid)に囲まれて戻る場合に、関数CreateInstanceS3は、制御IUnknownインタフェース（punkOuter)に対するポインタに渡される。関数CreateInstanceS3は識別されたインタフェースに対するポインタ(ppv) を戻す。関数CreateInstanceS3は、パラメータpunkOuter を渡しながら、メソッドS3::CreateInstanceを呼び出す。メソッドS3::CreateInstanceは、オブジェクトＳ３を具体化し、オブジェクトＳ３のIUnknownインタフェースに対するポインタ（punk）を戻す。関数CreateInstanceS3は、メソッドS3::QueryInterfaceを呼び出し、識別されたインタフェースに対するポインタを検索する。一時ポインタpunkは不要になるので、関数CreateInstanceS3はメソッドS3::Release を呼び出す。
【００４０】
メソッドS3::CreateInstanceは、オブジェクトＳ３を具体化し、オブジェクトＳ３のIUnknownに対するポインタ（ppunk)を戻す。メソッドS3::CreateInstanceは、制御IUnknownに対するポインタ（punkOuter)に渡される。メソッドS3::CreateInstanceは、新たにオペレータを使用してオブジェクトＳ３を具体化する。具体化を通じて、構成子S3::S3を呼び出し、パラメータpunkOuter に渡す。オブジェクトＳ３が構成された後、メソッドS3::CreateInstanceは関数CreateInstanceS1を呼び出して囲まれたオブジェクトＳ１を作成する。メソッドS3::S3CreateInstanceはパラメータ m p01->punkOuterおよびIUnknownインタフェース対応のインタフェース識別子を渡して、オブジェクトＳ１のIUnknownインタフェースに対するポインタに戻される。メソッドS3::CreateInstanceは、データメンバS3:: m punkS1内に戻されたポインタを格納する。メソッドS3::CreateInstanceは、関数CreateInstanceS2を呼び出し、オブジェクトＳ１の作成と同様の方法でオブジェクトＳ２を作成する。メソッドS3::CreateInstanceは、パラメータiid によって識別されたインタフェースに対するポインタを検索する。
メソッドS3::AddRefは、オブジェクトＳ３の参照カウントをインクリメントする。メソッドS3::Release は、参照カウントをディクリメントする。参照カウントが０になると、メソッドS3::Release は、オブジェクトＳ３を削除する。
【００４１】
構成子S3::S3は、データメンバ m A 、 m B 、 m punkouter および m refcountを初期化する。構成子S3::S3は、パラメータpunkOuter に渡される。データメンバ m A および m B の具体化を通じ、構成子 A::A および B::B を呼び出して、オブジェクトＳ３対応のポインタthisに渡す。パラメータpunkOuter の値がNULLであれば、構成子S3::S3は、（新たに具体化したオブジェクトＳ３をポイントする）ポインタthisの値にデータメンバ m punkOuter をセットする。パラメータpunkOuter の値がNULLでない場合には、構成子S3::S3はデータメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトＳ３が囲まれている場合には、集合体の制御IUnknownインタフェースの値をポイントし、オブジェクトＳ３が囲まれていない場合にはオブジェクトＳ３のIUnknownインタフェースをポイントする。構成子S3::S3は、データメンバ m refcountを０に初期化する。
消去関数S3::-S3 は、メソッドS1::Release を呼び出して、囲まれたオブジェクトＳ１の参照カウントをディクリメントする。オブジェクトＳ１の具体化を通じ、参照カウントはすでに１にセットされているので、メソッドS1::Release はオブジェクトＳ１を削除する。消去関数S3::-S3 は、同様の方法でオブジェクトＳ２の参照カウントをディクリメントする。
【００４２】
インタフェースＡおよびＢは、インタフェースＣのメソッドに同様の動作をする。こうしてインタフェースＡおよびＢは、オブジェクトＳ３が囲まれた場合に提示できる。
図５は、オブジェクトＳ３のデータ構造レイアウトを示すブロック図である。このデータ構造レイアウトは、インスタンスデータ５０１、仮想関数表５０２、５０３および５０４、メソッド５０５乃至５１７、オブジェクトＳ１・４０１乃至４１３およびオブジェクトＳ２・５１９とを含む。インスタンスデータ５０１は、制御IUnknownインタフェースとクラスＡおよびＢのインスタンスであるデータメンバ m A および m B と、オブジェクトＳ３のIUnknownインタフェースをポイントするデータメンバ m punkOuter と、オブジェクトＳ３対応の参照カウントを含むデータメンバ m refcountと囲まれたオブジェクトＳ１のIUnknownをポイントするデータメンバ m punkS1と、囲まれたオブジェクトＳ２・５１５のIUnknownインタフェースをポイントするデータメンバ m punkS2とに対応した仮想関数表に対するポインタを含む。囲まれたオブジェクトＳ１が具体化されると、そのデータメンバ S1::m punkOuter は初期化され、オブジェクトＳ３のIUnknownインタフェースをポイントする。同様に囲まれたオブジェクトＳ２が具体化されると、そのデータメンバ S2::m punkOuter は初期化され、オブジェクトＳ３のIUnknownインタフェースをポイントする。
【００４３】
図６および図７は、囲んでいるオブジェクトと囲まれたオブジェクトとの共同動作を示すブロック図である。図６は、別のオブジェクトに囲まれていないクラスＳ１のオブジェクトを示すブロック図である。クラスＳ１のオブジェクト６０１には、データメンバ m punkOuter を含み、これはIUnknownインタフェースおよびメソッド６０３、６０４、６０５および６０６をポイントする。メソッドIUnknown::QueryInterface６０３は、要求されたインタフェースに対するポインタを戻し、参照カウントをインクリメントする。メソッド C::QueryInterface６０５および C::AddRef６０６は、IUnknownインタフェースの対応するメソッドを呼び出す。（図に示さない）クラスＤのメソッドの処理系は、クラスＣのものと同様である。図７は、クラスＳ１およびＳ２のオブジェクトを囲むクラスＳ３のオブジェクトを示す図である。オブジェクトＳ２は、オブジェクトＳ１と同様であるが図に示していない。クラスＳ１のオブジェクト６０１のデータメンバ mpunkOuter ６０２は、クラスＳ３のオブジェクト６１０のIUnknownインタフェースをポイントする。メソッドIUnknown::QueryInterface６１３は、提示された各オブジェクトに対するポインタを戻し、データメンバ m punkS1・６１９によってポイントされるメソッドIUnknown::QueryInterface６０３を呼び出し、インタフェースＣに対するポインタを検索する。クラスＡおよびＢのメソッドQueryInterface６１５および６１７は、データメンバ m punkOuter ６１２によって示されるメソッドを呼び出す。
【００４４】
上述の本発明の実施例において、集合体の制御IUnknownインタフェースのメソッドQueryInterfaceは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、提示されたインタフェースに対するポインタを検索する。本発明の別の実施例においては、囲んでいるオブジェクトが提示する囲まれたオブジェクトのインタフェースに対するポインタを、囲んでいるオブジェクトを変換することができる。このため、制御IUnknownのメソッドQueryInterfaceが呼び出されると、このメソッドは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出すというよりは、変換されたポインタを検索して戻すことができる。この別の実施例を実現するためは、囲んでいるオブジェクトによって、各変換されたポインタに対応したデータメンバを定義する。（一般に囲んでいるオブジェクトの構成中に）囲まれたオブジェクトが具体化された場合、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して提示されたインタフェースのポインタを検索する。検索されたポインタが参照カウントされず、囲んでいるオブジェクトが囲まれたオブジェクトに対して１つのポインタのみを効果的に維持することが好ましい（S3:: m punkS1など）。囲まれたオブジェクトは、メソッドRelease に対して１回のコールだけで削除することができる。したがって、ポインタを変換した後、囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、変換されたポインタに属する参照カウントを除去する。
【００４５】
上述の本発明の実施例において、制御IUnknownインタフェースのメソッドQueryInterfaceの処理系は、どのインタフェースが提示されるかを指定するswitch文を含む。例えば、メソッドS3::QueryInterfaceのswitch文は、提示された各インタフェースＡ、Ｂ、ＣおよびＦと制御IUnknownに対するcaseラベルを含む。このため、提示されたインタフェースは囲んでいるオブジェクトの実現中に静的に定義される。別の実施例においては、制御IUnknownインタフェースメソッドQueryInterfaceを囲まれたオブジェクトの外部インタフェースに関する知識を特に必要としなくても実現できる。実現しないインタフェースに対するポインタを要求したとき、メソッドQueryInterfaceは囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、囲まれたオブジェクトによって実現されていれば、識別されたインタフェースに対するポインタを検索する。コード表５は、オブジェクトＳ３に対する制御IUnknownインタフェースのメソッドQueryInterfaceのＣ＋＋処理系であり、本発明の別の１実施例である。かこまれたオブジェクトの外部インタフェースに対するポインタを戻すことに加えて、制御IUnknownのメソッドQueryInterfaceは、他のすべての外部インタフェースを提示する一方で、特定の外部インタフェースを提示せずに実現することができよう。
【００４６】
0003672334.tif 000018
上述の実施例において、エラーチェックについては述べなかった。さまざまな種類のエラーチェックを実行して、集合体が適切に作成されることを確認することが望ましい。例えば、囲んでいるオブジェクトが集合できないオブジェクトを囲もうとした場合、囲んでいるオブジェクトの具体化に障害がおきるようにするなどである（関数CreateInstanceS1が障害を示すフラッグを戻すなど）。
【００４７】
上述の実施例では、集合オブジェクト自体が、囲んでいるオブジェクト内に囲まれたオブジェクトとなりうる。この囲い込み（ネスティング）は深さを問わず起こりうる。また、集合オブジェクトが集合不可能にすることもできる。クラスXXに対応する関数CreateInstanceXXは、パラメータpunkOuter がヌルでない場合、すなわち、集合が所望される場合に障害を示すフラグを戻すことができる。
上述の実施例では、集合オブジェクトの各外部インタフェースに対応するオブジェクトは、集合オブジェクトのデータメンバとして、具体化される。これに代わる実施例では、集合オブジェクトのデータメンバとして実現されるよりむしろ、外部インタフェースが集合オブジェクトによって継承される。コード表６は、外部インタフェースＣおよびＤを有する集合クラスのＣ＋＋クラス定義を含む。クラスＳ１は、抽象クラスICおよびIDを継承する。インタフェースICおよびIDの処理系は導出クラスＳ１に対するポインタを格納してデータメンバ m punkOuter にアクセスする必要はない。逆に、インタフェースICおよびIDの処理系は、コード表３に示すように、導出クラスに対するポインタをデータメンバ m pS1 に格納する。インタフェースを継承する際に、他の処理系が可能であると評価する当業者もいることだろう。
【００４８】
0003672334.tif 000019
0003672334.tif 000020
0003672334.tif 000021
本発明に関しては、好ましい態様を述べてきたが、本発明をその態様のみ限定する意図はない。本発明の精神に則った修正および変更は、当業者らによって明らかなものとなろう。本発明の適用範囲は添付の請求の範囲において定められる。
【００４９】
【発明の効果】
以上説明したように、本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に、囲まれたオブジェクトを集合させ、囲まれたオブジェクトがオブジェクト管理インタフェースと外部インタフェースとを有し、囲んでいるオブジェクトが制御オブジェクト管理インタフェースを有し、集合したオブジェクトによってクライアントに提示されたインタフェースが、インタフェースの識別子を受取り識別したインタフェースに参照を戻すための質問メンバ関数を有し、囲んでいるオブジェクトのインスタンスを作成し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲んでいるオブジェクトによって提示されたインタフェースの識別子を受け取って提示されたインタフェースに対する参照を戻し、さらに、囲まれたオブジェクトのインスタンスを作成し、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、受け取った識別子を渡して囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの中から呼び出された質問メンバ関数によって戻される参照を識別されたインタフェースの参照として戻すので、複雑な手続きを取らず所望のコードを共用し、プログラム開発時のコストを低減させることができるという効果がある。
【図面の簡単な説明】
【図１】オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。
【図２】スプレッドオブジェクトのサンプルデータ構造を示すブロック図である。
【図３】本発明による集合オブジェクトを示すブロック図である。
【図４】本発明によるクラスＳ１のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。
【図５】本発明によるオブジェクトＳ３のデータ構造レイアウトを示すブロック図である。
【図６】本発明による別のオブジェクトに囲まれていないクラスＳ１のオブジェクトを示すブロック図である。
【図７】本発明によるクラスＳ１およびＳ２のオブジェクトを囲むクラスＳ３のオブジェクトを示す図である。
【符号の説明】
１０１  インスタンスデータ構造
１０２、２０２、２０５、２０６、４０２、４０３、４０３Ａ、５０２、５０３、５０４  仮想関数表
１０３、１０４、１０５  メンバ関数
２０１  オブジェクトデータ構造
２０３  IBasicインタフェースデータ構造
２０４  IBasicインタフェースデータ構造
２０７、２０８、２０９、２１０、２１１、２１２、２１３、２１４、２１５、２１６、２１７、２１８、２１９、２２０、２２１  メソッド
２２２  形式
３０１  囲んでいるオブジェクトＳ３
３０２  囲まれたオブジェクトＳ２
３０３  囲まれたオブジェクトＳ１
３０４  処理系Ｉ３
４０１  インスタンス構造
４０４、４０５、４０６、４０６、４０８  関数
４０９、４１０、４１１、４１２  クラスＣのメンバ関数
４１３、４１４、４１５、４１６  クラスＤのメンバ関数
５０１  インスタンスデータ
５０５、５０６、５０７、５０８、５０９、５１０、５１１、５１２、５１３、５１４、５１５、５１６、５１７、６０３、６０４、６０５、６０６、６１３、６１５、６１７  メソッド
５１９  オブジェクトＳ２
６０１  クラスＳ１のオブジェクト
６０２  データメンバ関数
６１０  クラスＳ３のオブジェクト
６１２  データメンバ
６１９  データメンバ
【図１】
0003672334.tif 000022
【図２】
0003672334.tif 000023
【図３】
0003672334.tif 000024
【図４】
0003672334.tif 000025
【図５】
0003672334.tif 000026
【図６】
0003672334.tif 000027
【図７】
0003672334.tif 000028