JP4322967B2 - オブジェクト集合方法及びシステム - Google Patents
オブジェクト集合方法及びシステム Download PDFInfo
- Publication number
- JP4322967B2 JP4322967B2 JP00830895A JP830895A JP4322967B2 JP 4322967 B2 JP4322967 B2 JP 4322967B2 JP 00830895 A JP00830895 A JP 00830895A JP 830895 A JP830895 A JP 830895A JP 4322967 B2 JP4322967 B2 JP 4322967B2
- Authority
- JP
- Japan
- Prior art keywords
- interface
- enclosed
- objects
- function member
- enclosing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
- G06F12/0261—Garbage collection, i.e. reclamation of unreferenced memory using reference counting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99941—Database schema or data structure
- Y10S707/99944—Object-oriented database structure
Description
【クロスレファレンス】
本発明は、参考としてここに取り上げる1992年12月24日出願の「オブジェクトの集合方法及びシステム(A Method and System for Aggregating Objects) 」と題する米国特許出願第07/996,552号の一部継続出願である。
【0002】
【産業上の利用分野】
本発明は、一般に、コンピュータにおいてオブジェクトに対してインターフェイスを実行する方法及びシステムに係、より詳細には、オブジェクトを集合させる方法及びシステムに係る。
【0003】
【従来の技術】
コンピュータソフトウェアシステムが複雑になるにつれ、ソフトウェアを開発するためのコストも増加している。ソフトウェア開発コストを最小限にするために、開発者は、コードを共用することが多い。従来の開発技術では、3つのタイプのコード共用を使用している。すなわち、(1)ソースコードの共用、(2)コンパイル済コードの共用、(3)継承によるコード共用、である。
【0004】
又、コンピュータソフトウェアシステムが複雑になるにつれ、ソフトウェアのユーザは、コンピュータシステムの保守及び拡張が益々複雑になることに直面している。ソフトウェアの販売者が新たな又は改良した能力を形成するたびに、その特典を得ようとするユーザは、それらの変更をともかく組み込まねばならない。公知のシステムは、一般に、このようなユーザがソフトウェアをグレードアップする必要があり、ユーザは、システムの少なくとも一部分を再設置することを余儀なくされる。或いは、公知システムは、ソフトウェアの開発者が将来の増強を前もって計画し、そしてオリジナルのシステムに必要なフックを設置して、将来に増強手段を装填できるようにする必要がある。
【0005】
更に、ユーザが、異なるソフトウェア販売者によって発売された能力を付加することにより現在所有しているソフトウェアの一部分の能力を増強しようとする場合には、ソフトウェア販売者が前もって計画しているものによりユーザに制限が課せられる。公知のシステムは、一般に、ソフトウェアの2つの部片が一緒に機能するように設計されると共に、これらソフトウェア部片の少なくとも一方がその他方により与えられる能力を知ることが必要とされる。従って、公知のシステムでは、コードに対するその後の変更及びコードの共用を、ソフトウェア設計に考慮しておかねばならない。
【0006】
ソースコードおよびコンパイル済コードを共用する方法は、長年広く使用されてきた。ソースコードの共用とは、さまざまなコンピュータプログラム又は同一のコンピュータプログラムのさまざまなバージョンで同一のコードを使用することである。例えば、一般にスプレッドシートプログラムは、スップレッドシート表示を制御するソースコードを含む。ワードプロセッシングプログラムでスプレッドシートを文書内に埋め込むことができれば、そのワードプロセッシングプログラムは同一の(又はわずかに修正した)ソースコードを使用して、埋め込んだスプレッドシートオブジェクトを表示することができる。ソースコードは、一般に単独の開発者が複数のコンピュータプログラムを開発する際に共用される。他者と競争する関係上、開発者は他の開発者とコードを共用しない。さらに、コードを共用する場合でさえ、ソースコード受信者はソースコードを修正するのが一般的であり、この結果、ソースコードに対し2つのバージョンが維持されることになる。
【0007】
コンパイル済コードの共用とは、さまざまなコンピュータプログラムで同一のコンパイル済コードを使用することである。一般に、コンパイル済コードは静的リンクライブラリまたは動的リンクライブラリに格納される。静的リンクライブラリに格納されたコードは、実行前にコンピュータプログラムを連係した場合に共用される。例えば、スペルチェックプログラムの開発者は、そのプログラムをコンパイルして静的リンクライブラリにコンパイル済コードを格納することによってコンパイル済コードを共用できる。その後、静的リンクライブラリをワードプロセッシングプログラム開発者に配布することによって、これらの開発者はコンパイル済スペルチェックコードをそれぞれのワードプロセッシングプログラムに連係することができる。一般に、スペルチェックプログラム開発者は、コンパイル済コード修正して、特定開発者の特殊な要求に応じなければならない。こうした修正によって、コンパイル済コードの複雑化(とサイズの増大)を助長するだけでなく、他の受信者の要求と矛盾する可能性もある。他に、開発者が、静的リンクライブラリの複数のバージョンを分散することも考えられる。しかし複数のバージョンを保守するにはコストがかかりかねない。
【0008】
オブジェクト指向のプログラミング技術は、コードを共用できるようにする継承と称する概念を使用している。本発明は、オブジェクト指向のプログラミングを用いて以下に説明するので、良く知られたオブジェクト指向のプログラミング技術を要約する。オブジェクト指向プログラミング言語では、データのカプセル化とデータタイプの継承を支援するという2つの特徴が一般に知られている。データのカプセル化とは、関数とデータを結合させることである。継承は、あるデータタイプを別のデータタイプに関して宣言する能力を指す。
【0009】
C++言語では、オブジェクト指向言語はクラスを使用して支援される。クラスは、ユーザが定義したタイプである。クラスの宣言によって、クラスのデータメンバとメンバ関数が定義される。例えば、下記の宣言はCIRCLEというクラスのデータメンバとメンバ関数とを定義する。
変数xおよびyは、円の中心座標を指定し、変数radiusはその円の半径を指定する。これらの変数をクラスCIRCLEのデータメンバという。関数drawは、ユーザが定義した関数で、指定座標から指定した半径で円を描く。この関数drawをクラスCIRCLEの関数メンバという。あるクラスのデータメンバと関数メンバは、関数がクラスのインスタンスで動作するという点で一緒に結合される。クラスのインスタンスは、クラスのオブジェクトとも呼ばれる。
【0010】
C++の構文では、下記のステートメントは、オブジェクトa及びbがタイプクラスCIRCLEであることを宣言する。
CIRCLE a, b;
この宣言は、オブジェクトa及びbにメモリを割り当てる。下記のステートメントは、オブジェクトa及びbのデータメンバにデータを割り当てる。
a. x =2;
a. y =2;
a. radius =1;
b. x =4;
b. y =5;
b. radius =2;
下記のステートメントは、オブジェクトa及びbによって定義される円を描くのに用いられる。
a. draw();
b. draw();
【0011】
導出クラスは、その基本クラスの特性、すなわちデータメンバと関数メンバを継承するクラスである。例えば、下記の導出クラスCIRCLE FILLは、基本クラスCIRCLEの特徴を継承する。
この宣言は、クラスCIRCLE FILLが、クラスCIRCLE FILLの宣言時に導入したデータメンバ及び関数メンバ、即ちデータメンバ pattern及び関数メンバfillに加えて、クラスCIRCLEに存在する全てのデータメンバ及び関数メンバを含むことを指定する。この例では、クラスCIRCLE FILLは、データメンバx、y、radius、及びpattern と、関数メンバdraw及びfillとを有している。クラスCIRCLE FILLは、クラスCIRCLEの特徴を「継承する」と言える。他のクラスの特徴を継承するクラスは、導出クラス(CIRCLE FILLなど)である。他のクラスの特徴を継承しないクラスを一次クラス(ルートクラス)という(CIRCLEなど)。他クラスによって特徴が継承されるクラスは、基本クラスである(例えば、CIRCLEは、CIRCLE FILLの基本クラスである)。導出クラスは、複数のクラス特徴を継承することができる。つまり、導出クラスは複数の基本クラスを有することができる。これを多重継承という。
【0012】
導出クラスは、基本クラスが仮想的に継承されることを指定してもよい。基本クラスの仮想継承とは、仮想基本クラスのインスタンスが導出クラス中の1つしか存在しないことを意味する。例えば、下記は非仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : CIRCLE {... };
class CIRCLE 2 : CIRCLE {... };
class PATTERN : CIRCLE 1, CIRCLE 2 {... };
この宣言では、クラスPATTERN は、クラスCIRCLE 1 及びCIRCLE 2 によりクラスCIRCLEを非仮想的に2度継承する。つまり、クラスPATTERN にはクラスCIRCLEのインスタンスが2つ存在するのである。
【0013】
下記は、2つの仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : virtual CIRCLE {... };
class CIRCLE 2 : virtual CIRCLE {... };
class PATTERN : CIRCLE 1, CIRCLE 2 {... };
導出クラスPATTERN は、クラスCIRCLE 1 及びCIRCLE 2 によりクラスCIRCLEを仮想的に2度継承する。クラスCIRCLEは、2度仮想的に継承されるので、導出クラスPATTERN には、クラスCIRCLEのオブジェクトが1つしか存在しないことになる。クラス導出が複雑な場合に、仮想継承が非常に有益であることが当業者に明らかであろう。
【0014】
クラスは、その関数メンバが仮想的であるかどうかも指定できる。ある関数メンバが仮想的であると宣言することは、その関数が導出クラスにおいて同一名及び同一タイプの関数によってオーバーライドできることを意味する。下記の例では、関数drawをクラスCIRCLEとCIRCLE FILLで仮想的であると宣言している。
仮想関数が、実現を与えずに宣言される場合には、純粋な仮想関数と称される。純粋な仮想関数は、純粋な指定子"=0"で宣言された仮想関数である。あるクラスが純粋な仮想関数を指定する場合には、いかなる導出クラスも、その関数メンバが呼び出される前に、その関数メンバに対する実現を指定する必要がある。
【0015】
オブジェクトをアクセスするために、C++言語は、ポインタデータタイプを与える。ポインタは、メモリ中のオブジェクトのアドレスである値を保持する。ポインタにより、オブジェクトに参照することができる。下記のステートメントは、変数 c ptr がタイプクラスCIRCLEのオブジェクトのポインタであることを宣言し、そしてオブジェクトcのアドレスを保持するように変数 c ptr をセットする。
CIRCLE *c ptr
c ptr = &c;
この例に続き、下記のステートメントは、オブジェクトaがタイプクラスCIRCLEであり、オブジェクトbがタイプクラスCIRCLE FILLであることを宣言する。
CIRCLE a ;
CIRCLE FILL b;
下記のステートメントは、クラスCIRCLEで定めたように関数drawを参照する。
a. draw() ;
一方、下記のステートメントは、クラスCIRCLE FILLで定義した関数drawを参照する。
b. draw() ;
更に、下記のステートメントは、キャストオブジェクトbをタイプクラスCIRCLEのオブジェクトにタイプ決めし、クラスCIRCLE FILLで定義した関数drawを呼び出す。
CIRCLE *c ptr;
c ptr = &b;
c ptr->draw() ; // CIRCLE FILL :: draw()
従って、呼び出される仮想関数は、関数CIRCLE FILL::drawである。
【0016】
図1は、オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。オブジェクトはインスタンスデータ(データメンバ)およびメンバ関数であり、オブジェクトを実際に動作させる。オブジェクトの表現に使用するデータ構造は、インスタンスデータ構造101と、仮想関数表102と、関数メンバ103、104及び105から成る。インスタンスデータ構造101は、仮想関数表102に対するポインタとデータメンバを含む。仮想関数表102は、オブジェクトに対して定義した各仮想関数メンバのエントリを含む。各エントリは、対応する関数メンバを実行するコードの参照を含む。このサンプルオブジェクトのレイアウトは、参考としてここに取り上げる米国特許出願第07/682,537 号「A Methodfor Implementing Virtual Function and Virtual Bases in a Compiler for an Object Oriented Programming Language 」に適合する。以下の説明において、オブジェクトを、C++プログラミング言語で定義したクラスのインスタンスとして述べる。当業者は、オブジェクトは他のプログラミング言語を使用して定義できることが明らかであろう。
【0017】
クラスの継承は、コード共用の1形式である。クラス開発者は、他の開発者にクラスの実現体を提供することができる。この他の開発者は、提供されたクラスから導出するクラスを作成することができる。ただし、クラスが継承されて、仮想関数がオーバーライドされる場合は、オーバーライド仮想関数のテストは複雑になることが考えられる。オーバーライド仮想関数は、非オーバーライド関数に影響を与えるようにオブジェクトの状態を修正することができる。このため、各継承関数は、オーバーライド仮想関数のテストに関連して独立したテストをする必要がある。テストの複雑さを改善するには、クラスの実現体の開発者は、その実現体をもつソースコードを分配することができる。不幸にも、ソースコードの分配は、上述のように、共用ソースコードに同様の支障が生じる。
【0018】
オブジェクト指向技術の利点は、オブジェクトの共用を容易にできることである。特に、オブジェクト指向技術は複合文書の作成を容易にする。複合文書は、さまざまなコンピュータプログラムによって生成されたオブジェクトを含む文書である。(一般に、オブジェクトのデータメンバとクラスタイプのみが複合文書に格納される。)例えば、スプレッドシートプログラムで生成したスプレッドシートオブジェクトを含むワードプロセッシング文書は、複合文書である。ワードプロセッシングプログラムでは、ユーザは(セルなど)スプレッドシートをワードプロセッシング文書内に埋め込むことができる。この埋め込みは、ワードプロセッシングプログラムを、埋め込むべきオブジェクトのクラス定義を使用して埋め込んだオブジェクトの関数メンバにアクセスして、コンパイルすることによって可能となる。このため、ワードプロセッシングプログラムは、ワードプロセッシング文書に埋め込むことができるオブジェクトの各クラスのクラス定義を使用してコンパイルしなければならない。新しいクラスのオブジェクトをワードプロセッシング文書に埋め込むには、ワードプロセッシングプログラムは新たなクラス定義でリコンパイルしなければならないと考えられる。このため、ワードプロセッシングプログラムの開発者が選択したクラスオブジェクトだけを埋め込むことができる。さらに、新たなクラスをワードプロセッシングプログラムを新たにリリースしてのみ支援することができる。
【0019】
任意クラスのオブジェクトを複合文書に埋め込むには、ワードプロセッシングプログラムがコンパイル時間にクラス定義にアクセスする必要なしにオブジェクトをアクセスできるようにインタフェースを定義する。抽象クラスは、実現部をもたない仮想関数メンバ(純粋な仮想関数メンバ)が少なくとも1つは存在するクラスである。インタフェースは、データメンバがない抽象クラスであり、その仮想関数はすべて純粋である。従って、インターフェイスは、2つのプログラムがコミニケーションすべきプロトコルを与える。インターフェイスは、一般に、導出に対して使用され、プログラムは、クラスが導出されるインターフェイスに対して実現部を与えるようなクラスを実現する。その後に、これら導出されたクラスのインスタンスとしてオブジェクトが形成される。
【0020】
以下のクラス定義は、インタフェースの定義の一例である。この例では、説明を簡略にするために、オブジェクトのクラスを文書に埋め込めるようにするのではなく、ワードプロセッシングプログラムは、スプレッドシートオブジェクトを埋め込めるようにする。オブジェクトがどのように実現されるかに係わりなく、このインタフェースを与えるスプレッドシートオブジェクトを埋め込むことができる。更に、スプレッドシートオブジェクトは、ワードプロセッシングプログラムをコンパイルする前に実現されるかその後に実現されるかに係わりなく、埋め込むことができる。
スプヘレッドシートプログラムの開発者は、スプレッドシートオブジェクトをワードプロセッシング文書に埋め込むことができるように、インタフェースの実現を与える必要がある。
【0021】
ワードプロセッシングプログラムがスプレッドシートオブジェクトを埋め込むときは、そのプログラムは、スプレッドシートオブジェクトに対するインタフェースを実現するコードにアクセスしなければならない。そのクラスコードにアクセスするために、各実現部には独特のクラス識別子が与えられる。例えば、マイクトソフト社が開発したスプレッドシートオブジェクトは、「MSSpreadsheet 」というクラス識別子を有するが、他社開発のスプレッドシートオブジェクトを実施するコードは、「LTSSpreadsheet」というクラス識別子を有する。各コンピュータシステムには永続登録が維持され、これは、各クラス識別子を、クラスを実現するコードにマップする。一般に、スプレッドシートプログラムがコンピュータシステムにインストールされると、永続登録は、スプレッドシートオブジェクトのクラスの利用性を反映するように更新される。スプレッドシート開発者が、インタフェースによって定義された各関数メンバを実現しそして永続登録が維持される限り、ワードプロセッシングプログラムは、開発者のスプレッドシートオブジェクトのインスタンスをワードプロセッシング文書に埋め込むことができる。ワードプロセッシングプログラムは、その埋め込まれたスプレッドシートオブジェクトの関数メンバを、誰がそれを実現したか又はそれらがどのように実現されたかに係わりなく、アクセスする。
【0022】
しかし、種々のスプレッドシート開発者は、ある関数メンバのみを実現したいであろう。例えば、あるスプレッドシート開発者は、データベース支援は実現したくないが、他の全ての関数メンバは支援したいであろう。オブジェクトを埋め込むことができる上に、スプレッドシートの開発者が関数メンバの一部のみを支援できるようにするため、スプレッドシートオブジェクトに対して多数のインタフェースが定義される。例えば、インタフェースIDatabase 及びIBasicは、下記のようにスプレッドシートに対して定義できる。
各スプレッドシート開発者は、IBasicインタフェースを実現し、IDatabase インターフェイスを任意に実行する。
【0023】
実行時に、ワードプロセッシングプログラムは、埋め込まれるべきスプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを決定しなければならない。この決定をするために、どのインタフェースがオブジェクトに対して実現されるかを指示する関数メンバと共に別のインタフェース(各スプレッドシートオブジェクトが実現する)が定義される。このインタフェースは、IUnknownという名称であり(そして未知のインタフェース又はオブジェクト管理インタフェースと称され)、下記のように定義される。
このIUnknownインタフェースは、関数メンバ(メソッド)QueryInterfaceを定義する。メソッドQueryInterfaceには、(タイプREFIIDの)パラメータiid においてインタフェース識別子(例えば、IDatabase )が通され、そしてこのメソッドがパラメータppv において呼び出されるオブジェクトに対し識別されたインタフェースの実現を指すポインタを返送する。このオブジェクトがインタフェースを支援しなければ、このメソッドは偽を返送する。タイプHRESULT は、予め定義された状態を指示し、タイプREFIIDは、インターフェイス識別子に対する参照を指示し、そしてタイプULONG は、非サインの長い整数を指示する。
【0024】
コード表1は、クラスXXに対するメソッドQueryInterfaceを一般的に実現するC++擬似コードを含み、これは、クラスIUnknownを継承する。スプレッドシートオブジェクトがIDatabase インタフェースを支援する場合、メソッドQueryInterfaceはswitchステートメント内に適切なcaseラベルを含む。変数pIBasic とpIDatabaseは、各々、IBasicインタフェースとIDatabase インタフェースの仮想関数表に対するポインタを指す。メソッドQueryInterfaceは、インタフェースのポインタが返送されるときにクラスXXのオブジェクトに対する参照カウント値をインクリメントするためにメソッドAddRef(以下に述べる) を呼び出す。
【0025】
インタフェースIUnknownは、メソッドAddRef及びRelease も定義し、これらは参照カウントの実行に使用される。インタフェースに対する新たな参照が形成されるときに、メソッドAddRefを呼び出し、オブジェクトの参照カウントをインクリメントする。参照がもはや必要なくなると、メソッドRelease を呼び出し、オブジェクトの参照カウントをディクリメントし、参照カウントが0になったときに、オブジェクトの割当てを解除する。コード表2は、クラスXXに対するメソッドAddRef及びRelease を一般的に実現するC++擬似コードを含み、これは、クラスIUnknownを継承する。
【0026】
IDatabase インタフェースとIBasicインタフェースはIUnknownインタフェースを継承する。下記の定義は、IUnknownインタフェースの使用法を示す。
【0027】
図2は、ネスト状クラスを用いたスプレッドオブジェクトのデータ構造例を示すブロック図である。このスプレッドオブジェクトは、オブジェクトデータ構造201と、IBasicインタフェイスデータ構造203と、IDatabase インターフェイスデータ構造204と、仮想関数表202、205及び206と、メソッド207ないし221とを含む。オブジェクトデータ構造201は、仮想関数表202に対するポインタと、IBasic及びIDatabase インタフェイスに対するポインタとを含む。仮想関数表202の各エントリは、IUnknownインタフェイスのメソッドに対するポインタを含む。IBasicインタフェイスデータ構造203は、仮想関数表205に対するポインタを含む。仮想関数表205の各エントリは、IBasicインタフェイスのメソッドに対するポインタを含む。IDatabase インタフェース構造204は、仮想関数表206に対するポインタを含む。仮想関数表207の各エントリは、IDatabase インタフェースのメソッドのポインタを含む。IBasic及びIDatabase インタフェースは、IUnknownインタフェースを継承するので、仮想関数表205及び206は、メソッドQueryInterface、AddRef及びRelease に対するポインタを各々含む。以下、オブジェクトデータ構造は、オブジェクトをアクセスすることのできるインタフェースでラベル付けした形式222により表わされる。
【0028】
下記の擬似コードは、スプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかをワードプロセッシングプログラムがいかに決定するかを示す。
if(pSpreadsheet->QueryInterface(“IDatabse",& pIDatabase))
// IDatabase Supported
else
// IDatabase not Supported
ポインタ pSpreadsheet は、図2に示すスプレッドシートクラスのインスタンスに対するポインタである。(pSpreadsheetは、データ構造210を指す。)このオブジェクトがIDatabase インタフェースを支援する場合は、メソッド207により定義されたメソッドQueryInterfaceは、IDatabase データ構造204を指すようにポインタpIDatabaseをセットし、その値として真を返送する。
【0029】
通常、オブジェクトは、変数「宜言」又は「新たな」演算子によって具体化することができる(メモリ内に作成したオブジェクトのインスタンス)。しかし、どちらの具体化技術も、コンパイル時にクラス定義を必要とする。ワードプロセッシングプログラムが実行時にスプレッドシートオブジェクトを具体化できるためには別の技術が必要とされる。その1つの技術は、グローバルな関数CreateInstanceXXを与え、これは、次のように定義される。
static void CreateInstanceXX(REFIID iid, void**ppv) = 0 ;
メソッドCreateInstanceXXは、クラスXXのオブジェクトを実現化し、ポインタppv をパラメータiid により定義されたオブジェクトのインタフェースへ戻す。
【0030】
【発明が解決しようとする課題】
本発明の目的は、オブジェクトを集合する方法及びシステムを提供することである。
【0031】
本発明の別の目的は、オブジェクトの動作を動的に変更する方法及びシステムを提供することである。
【0032】
本発明の更に別の目的は、オブジェクトを動的に集合する方法及びシステムを提供することである。
【0033】
本発明の更に別の目的は、オブジェクトを静的に集合する方法及びシステムを提供することである。
【0034】
本発明の更に別の目的は、オブジェクトを別のオブジェクト内に囲う一方、その囲まれたオブジェクトのインターフェイスをその囲んでいるオブジェクトのクライエントへ提示する方法及びシステムを提供することである。
【0035】
本発明の更に別の目的は、囲んでいるオブジェクトが具体化された後にオブジェクトを別のオブジェクト内に囲む方法及びシステムを提供することである。
【0036】
本発明の更に別の目的は、異なるタイプのオブジェクトを単一のオブジェクトへと動的に組み合わせる方法及びシステムを提供することである。
【0037】
本発明の更に別の目的は、オブジェクトの実現を変更せずに別のオブジェクト内に囲むことができるか又は別のオブジェクト内に囲まれないようなオブジェクトを実現する方法及びシステムを提供することである。
【0038】
本発明の更に別の目的は、オブジェクトが集合であることをクライエントが分からないような集合オブジェクトを実現する方法及びシステムを提供することである。
【0039】
本発明の更に別の目的は、囲まれたオブジェクトそれ自体が任意の囲い込みレベルに対して囲んでいるオブジェクトとなり得るようなオブジェクトを囲い込む方法及びシステムを提供することである。
【0040】
本発明の更に別の目的は、新たなインターフェイスを追加することによりベースオブジェクトの動作を増強する方法及びシステムを提供することである。
【0041】
本発明の更に別の目的は、ベースオブジェクトの標準的な動作をオーバーライドするインターフェイスを追加することによりベースオブジェクトの見掛け上の動作を増強する方法及びシステムを提供することである。
【0042】
本発明の更に別の目的は、囲まれた又は囲んでいるオブジェクトがデフォールト機能を実現するように、囲んでいるオブジェクト内にオブジェクトを囲むことにより、オブジェクトにデフォールト機能を与える方法及びシステムを提供することである。
【0043】
本発明の更に別の目的は、囲まれたオブジェクト内に存在する共通の機能に対して制御動作を実現する方法及びシステムを提供することである。そして本発明の更に別の目的は、2つ以上の囲まれたオブジェクトによって実施されるインターフェイスをクライエントが要求するときにクライエントにどのインターフェイスを与えるかを決定する方法及びシステムを提供することである。
【0044】
【課題を解決するための手段】
上記の目的、及び本発明の以下の説明において明らかとなる他の目的は、コンピュータシステム内にオブジェクトを集合させる方法及びシステムによって達成される。好ましい実施例では、本発明の方法は、囲まれたオブジェクトを、囲んでいるオブジェクト内に集合させる。この囲まれたオブジェクトは、オブジェクト管理インタフェース及び1つ以上の外部インタフェースを有し、一方、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有する。集合オブジェクトによってクライアントに提示される各インタフェースは、インターフェイスの識別子を受け取ってその識別されたインターフェイスに対する参照を返送する問合せ関数メンバを有する。囲んでいるオブジェクトの制御オブジェクト管理インタフェースの問合せ関数メンバは、囲んでいるオブジェクトによって提示されたインタフェースの識別子を受取り、その提示されたインタフェースに対する参照を返送する。本発明の好ましい方法では、囲まれたオブジェクトのインスタンスを作成する。囲まれたオブジェクトの提示されたインタフェースの問合せ関数メンバは、インタフェースの識別子を受け取ると、その受け取った識別子を通すように上記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの問合せ関数メンバを呼び出し、そして上記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された問合せ関数メンバによって戻される参照を、識別されたインタフェースの参照として返送する。
【0045】
静的な集合の好ましい実施例では、囲まれたオブジェクトの問合せ関数メンバは、囲まれたオブジェクトの外部インターフェイスの知識で実現され、囲んでいるオブジェクト又は他の囲まれたオブジェクトのインターフェイス(制御オブジェクト管理インターフェイス以外の)の知識をもたない。囲んでいるオブジェクトの制御オブジェクト管理インターフェイスの問合せ関数メンバは、囲まれたオブジェクトの提示されたインターフェイスの知識で実現される。
【0046】
動的な集合の好ましい実施例では、オブジェクトによって実現されるインターフェイスインターフェイスをクライエントプログラムの実行中に集合できるようにすることによりオブジェクトを動的に変更することができる。インターフェイスは、それらを実現するオブジェクトをマルチタイプオブジェクトへと動的に囲い込むことにより集合される。追加されるべき各インターフェイスは、集合される能力をもつオブジェクトによって実現される。マルチタイプオブジェクトは、囲んでいるオブジェクトとして働くように形成される。マルチタイプオブジェクトは、追加インターフェイス関数メンバを有し、これは、囲んでいるマルチタイプオブジェクトにインターフェイスを追加することによりインターフェイスを集合するように使用できる。又、マルチタイプオブジェクトは、オブジェクトの全てのインターフェイスを集合するための追加オブジェクト関数も有する。又、マルチタイプオブジェクトは、クライエントから要求があった際にその追加されたインターフェイスに対する参照を検索するための問合せ関数も有している。この問合せ関数メンバは、囲んでいるマルチタイプオブジェクトの制御オブジェクト管理インターフェイスの一部分である。又、集合されるべきインターフェイスを実現するオブジェクトのインスタンスも形成される。その形成中に、囲んでいるマルチタイプオブジェクトに対するポインタが、囲まれるべきオブジェクトに通され、囲まれたオブジェクトが囲んでいるマルチタイプオブジェクトと通信できるようにする。集合されるべきインターフェイスを実現する形成されたオブジェクトは、集合されるべきインターフェイスに対する参照の検索をサポートする問合せ関数メンバを有する。好ましい方法は、囲んでいるマルチタイプオブジェクトの追加インターフェイス関数メンバ又は追加オブジェクト関数メンバを呼び出し、これに、集合されるべきインターフェイス実現する形成されたオブジェクトに対する参照を通す。その後に、囲んでいるマルチタイプオブジェクトの問合せ関数メンバが呼び出され、集合されたインターフェイスに対する参照が検索される。
【0047】
【実施例】
本発明は、オブジェクトを集合するためのコンピュータシステムにおける方法を提供する。オブジェクトは、静的又は動的に集合することができる。静的な集合を用いると、囲んでいるオブジェクトは、典型的に、囲まれたオブジェクトの提示されたインターフェイスについてのコンパイル時知識を有する。それ故、囲んでいるオブジェクトのオブジェクト管理インターフェイスは、この知識を用いて、囲まれたオブジェクトの提示されたインターフェイスへインターフェイスポインタを返送するようにカスタマイズされる。これらの静的に集合されたオブジェクトのインスタンスは、動的に(実行時に)形成される。
【0048】
動的な集合を用いると、囲んでいるオブジェクトが具体化され、これを用いてオブジェクト又はインターフェイスを実行時に集合することができる。囲んでいるオブジェクトは、囲まれたオブジェクト又はインターフェイスについての前もった知識をもたず、従って、囲んでいるオブジェクトによりコンパイル時知識が使用されない。同様に、囲まれたオブジェクト及びインターフェイスは、オブジェクト及びインターフェイスを集合するのに使用される制御オブジェクト管理インターフェイス除いて、囲んでいるオブジェクトのインターフェイスの実現又は存在についての知識をもたない。又、集合されたオブジェクト及びインターフェイスへのアクセスを制御するためのルールメカニズムも設けられる。
【0049】
これらタイプの集合の各々は、以下で詳細に説明する。好ましい実施例では、本発明の方法及びシステムは、中央処理ユニット、メモリ及び入力/出力装置を含むコンピュータシステムにおいて実現される。
【0050】
静的な集合
静的な集合の好ましい実施例において、集合オブジェクトはそのクライアントに複数のインタフェースを与える。オブジェクトを具体化するコンピュータプログラムをクライアントと呼ぶ。集合オブジェクトは、1つ以上の囲まれたオブジェクトと、IUnknownインタフェースの実現部とからなり、この実現部を集合オブジェクトの制御IUnknownインタフェースと呼ぶ。集合オブジェクトは、そのクライアントにそれ自体のインタフェースと囲まれたオブジェクトからのインタフェースを提示する。制御IUnknownインタフェースのメソッドQueryInterfaceはポインタを集合オブジェクトによって提示された各インタフェースに戻す。集合オブジェクトは各囲まれたオブジェクトを具体化する。この具体化は、集合オブジェクトの構成中に実行できるし、囲まれたオブジェクトのインタフェースが必要になるまで延期することもできる。各囲まれたオブジェクトは、制御IUnknownインタフェースに対するポインタを含む。囲まれたオブジェクトの提示されたインタフェースのメソッドQueryInterfaceは、IUnknownインタフェースのメソッドQueryInterfaceを呼び出すように実現されるのが好ましい。囲まれたオブジェクトが実現される場合に、一般に開発者は、囲んでいるオブジェクトがどんなインタフェースを提示するかについての知識はない。その結果、囲まれたオブジェクトのメソッドQueryInterfaceが制御IUnknownインタフェースを呼び出して、要求したインタフェースのポインタを検索する。制御IUnknownインタフェースのメソッドQueryInterfaceは、一般に、提示された全てのインタフェースの知識をもって実現される。オブジェクトが囲まれない場合は、制御IUnknownインタフェースは、そのオブジェクトのIUnknownインタフェースである。逆に、オブジェクトが囲まれる場合は、制御IUnknownインタフェースは囲んでいるオブジェクトのIUnknownインタフェースである。
【0051】
好ましい実施例では、集合オブジェクトが参照カウントを維持する。集合オブジェクトが具体化される場合に、その参照カウントは、1にセットされる。制御IUnknownのメソッドQueryInterfaceは、参照がクライアントに戻されるときに、参照カウントをインクリメントする。囲まれたオブジェクトの提示されたインタフェースのメソッドAddRefは、制御IUnknownインタフェースのメソッドAddRefを呼び出し、集合オブジェクトの参照カウントをインクリメントする。同様に、囲まれたオブジェクトの提示されたインタフェースのメソッドRelease は、制御IUnknownインタフェースのRelease を呼び出し、集合オブジェクトの参照カウントをディクリメントすると共に、参照カウントが0のときに集合オブジェクトを削除する。囲まれたオブジェクトが具体化される場合には、囲まれたオブジェクトの参照カウントは、1にセットされる。集合オブジェクトが削除された場合は、各囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、囲まれたオブジェクトを消去する。
【0052】
図3は、集合オブジェクトを示すブロック図である。集合オブジェクトS3はインタフェイスA、B、C、F及び制御IUnknownを提示する。集合(囲んでいる)オブジェクトS3は、囲まれたオブジェクトS1 303、囲まれたオブジェクトS2 302、及び実現部I3 304を含む。囲まれたオブジェクトS1は、外部インタフェイスC及びDを実現し、囲まれたオブジェクトS2は、外部インタフェイスE及びFを実現する。(外部インタフェイスとは、囲んでいるオブジェクトによって提示できるオブジェクトのインタフェイスである。内部インタフェイスとは、囲んでいるオブジェクトによっては提示できないオブジェクトのインタフェイスである。)実現部I3は、外部インタフェースA及びBと制御IUnknownを実現する。集合オブジェクトS3のクライアントは、オブジェクトが集合体であることが分かる必要はない。集合オブジェクトS3は、オブジェクトS1及びS2を集合オブジェクトS3の構成中又はそれより遅い時間に具体化する。実現部S3は、オブジェクトS1及びS2のIUnknownインタフェイスに対するポインタを含む。オブジェクトS1及びS2は、制御IUnknownインタフェイスに対するポインタを含むように初期化される。
【0053】
提示されたインタフェイスのメソッドQueryInterfaceは、提示された各インタフェイスに対するポインタを返送し、そしてポインタが返送されたときに集合オブジェクトの参照カウントをインクリメントすることができる。制御IUnknownのメソッドQueryInterfaceは、実現部I3が実現するインターフェイスA、B及び制御IUnknownのポインタに直接アクセスし、そして囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して、囲まれたオブジェクトS1及びS2の提示されたインタフェイスC及びFに対するポインタを検索する。囲まれたインタフェイスに対するポインタを返送するときには、制御IUnknownインタフェースのメソッドQueryInterfaceは、制御IUnknownインタフェイスのメソッドAddRefを呼び出すことにより、集合オブジェクトS3の参照カウントをインクリメントする。(制御IUnknownインタフェース以外の)各提示されたインタフェースのメソッドQueryInterfaceは、制御IUnknownインタフェースのメソッドQueryInterfaceを呼び出すのが好ましい。
【0054】
コード表3は、オブジェクトS1の好ましいクラス定義に対してC++擬似コードを含み、これは、オブジェクトのインスタンスを作成するグローバル関数と共に集合体(集合可能なオブジェクト)内に囲い込むことができる。クラスIUnknown、IC及びIDは、各インタフェイスのメソッドを定義するインタフェイスである。クラスS1は、IUnknownインタフェイス、ICインタフェイス及びIDインタフェイスを実現する。クラスS1は、IC及びIDインタフェイスを外部インタフェイスとして実現する。図4は、クラスS1のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。インスタンス構造401は、クラスS1のデータメンバ( m C 、 m D 、 m punkOuter 、 m refcount)と、仮想関数表ポインタ(S1::vfptr)に対するポインタを含む。データメンバ m C 及び m D は、各々クラスC及びDのオブジェクトのインスタンスである。クラスC及びクラスDは、クラスS1のフレンドであり、オブジェクトC及びDがクラスS1のプライベートメンバをアクセスできるようにする。仮想関数表ポインタS1::vfptr は、仮想関数表402を指し、データメンバ内の仮想関数表ポインタ m C S1::C::vfptrは、仮想関数表403を指し、更に、データメンバ内の仮想関数表ポインタ m D S1::D::vfptrは、仮想関数表403Aを指す。仮想関数表402は、IUnknownインタフェイス用に定義した仮想関数に対するポインタを含み、仮想関数表403は、Cインタフェイス用に定義した仮想関数に対するポインタを含み、仮想関数表403Aは、インタフェイスD用に定義した仮想関数に対するポインタを含む。仮想関数表403及び403A内の省略部分は、クラスC及びDの付加的な関数メンバに対するポインタを各々示している。関数404ないし408は、クラスS1の関数メンバである。関数407は、クラスS1の構成子である。関数408は、クラスS1の関数CreateInstanceである。関数409ないし412は、クラスCの関数メンバである。関数412は、クラスCの構成子である。関数413ないし416は、クラスDの関数メンバである。関数416は、クラスDの構成子である。
【0055】
コード表3に示したように、メソッドS1::QueryInterfaceは、インタフェイスC、インタフェイスD、又はインタフェイスIUnknownに対するポインタを返送する。インターフェイスC又はインターフェイスDに対するポインタが返送されるときには、メソッドS1::QueryInterfaceは、メソッドS1::AddRefを呼び出し、オブジェクトS1の参照カウントをインクリメントする。メソッドS1::AddRefは、参照カウントをインクリメントし、そしてメソッドS1::Release は、参照カウントをディクリメントすると共に、参照カウントが0になったときにオブジェクトS1を削除する。
【0056】
グローバル関数CreateInstanceS1は、クラスS1のオブジェクトのインスタンスを作成する。クライアントがこの関数を呼び出し、クラスS1のオブジェクトを具体化する。従って、クライアントは、コンパイル時間又は実行時にクラスS1の定義にアクセスせずに、クラスS1のオブジェクトを具体化できる。具体化されたオブジェクトS1が、集合オブジェクト及び返送すべきインタフェースの識別子iid 内に囲まれるときに、関数CreateInstanceS1に、制御IUnknown(punkOuter)に対するポインタが通される。関数CreateInstanceS1は、識別されたインタフェースに対するポインタ(ppv)を返送する。関数CreateInstanceS1は、パラメータpunkOuter を通すようにメソッドS1::CreateInstanceを呼び出す。メソッドS1::CreateInstanceは、オブジェクトS1を具体化し、そしてオブジェクトS1のIUnknownインタフェースに対するポインタ(punk) を返送する。関数CreateInstanceS1は、オブジェクトS1のメソッドQueryInterfaceを呼び出し、識別されたインタフェースに対するポインタを検索する。関数CreateInstanceS1は、次いで、オブジェクトS1のメソッドRelease を呼び出すが、これは、一時ポインタpunkがもはや必要ないからである。
【0057】
メソッドS1::CreateInstanceは、オブジェクトS1を具体化し、オブジェクトS1のIUnknownインタフェースに対するポインタ(ppunk)を返送する。メソッドS1::CreateInstanceには、制御IUnknownに対するポインタ(punkOuter)が通される。メソッドS1::CreateInstanceは新たな演算子を使用して、オブジェクトS1を具体化する。具体化の間に、構成子S1::S1を呼び出し、パラメータpunkOuter の値を通す。オブジェクトS1が構成された後に、メソッドS1::CreateInstanceは、メソッドS1::QueryInterfaceを呼び出し、オブジェクトS1のIUnknownインタフェイスに対するポインタを検索する。
【0058】
構成子S1::S1は、データメンバ m C 、 m D 、 m punkOuter 及び m refcountを初期化する。構成子S1::S1にはパラメータpunkOuter が通される。データメンバ m C 及び m D の具体化中、構成子C::C及びD::Dを呼び出し、オブジェクトS1に対するポインタthisを通す。パラメータpunkOuter の値がNULLであれば、構成子S1::S1はデータメンバ m punkOuter をポインタthisの値にセットする(このポインタは、新たに具体化したオブジェクトS1を指す)。パラメータpunkOuter の値がNULLでなければ、構成子S1::S1は、データメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトS1が囲まれている場合には、集合体の制御IUnknownの値を指し、そしてオブジェクトS1が囲まれていない場合には、オブジェクトS1の制御IUnknownを指す。構成子S1::S1は、データメンバ m fercountをゼロに初期化もする。
【0059】
構成子C::CにはオブジェクトS1に対するポインタが通される。構成子C1::C1は、通されたポインタをデータメンバC::m pS1 内に格納する。このデータメンバC::m pS1 は、クラスCのメソッドによって使用され、データメンバS1:: m punkOuter にアクセスする。
【0060】
メソッドC::QueryInterface 、C::AddRef 及びC::Releaseは、データメンバS1:: m punkOuter により指されたIUnknownインタフェースの対応メソッドを呼び出し、これは、オブジェクトS1が囲まれるときに集合体の制御IUnknownInterface を指す。
【0061】
クラスDの構成子及びその他のメソッドは、クラスCの構成子及びその他のメソッドに類似している。
【0062】
図4は、集合体の部分でないオブジェクトS1のインスタンスを示す。データメンバS1::C::m pS1 、S1::D::m pS1 及び S1::m punkOuter は、オブジェクトS1自体に対するポインタに初期化される。データメンバ m C 及びm D のメソッドQueryInterface、AddRef及びRelease は、オブジェクトS1のインタフェースのIUnknownメソッドを呼び出す。
【0063】
インタフェイスE及びFを実現するオブジェクトS2は、上述のオブジェクトS2と類似している。
【0064】
コード表4は、集合オブジェクトの好ましいクラス定義に対するC++擬似コードを含む。クラスS3は、インタフェイスIUnknownA、B、C及びFを提示する。インタフェイスCを与えるために、クラスS3はオブジェクトS1を囲み、インタフェイスCを提示する。インタフェイスFを与えるために、クラスS3はオブジェクトS2を囲み、インタフェイスFを提示する。オブジェクトS3は、インタフェイスC及びFに対するポインタを制御IUnknownインタフェイスのメソッドQueryInterfaceを介して戻すことによってインタフェイスC及びFを提示する。オブジェクトS1のインタフェイスD及びオブジェクトS2のインタフェイスEは、外部インタフェイスであるが、オブジェクトS3はこれらのインタフェイスを提示しない。
【0065】
メソッドS3::QueryInterface、S3::AddRef及びS3::Release は、集合体の制御IUnknownインタフェイスを構成する。メソッドS3::QueryInterfaceは、制御IUnknownインタフェイスA、B、C及びFに対するポインタを返送する。制御IUnknownインタフェイスのポインタが返送されるときは、メソッドS3::QueryInterfaceは、メソッドS3::AddRefを呼び出して、オブジェクトS3に対する参照カウントをインクリメントする。メソッドS3::AddRefは、参照カウントをインクリメントし、メソッドS3::Release は参照カウントをディクリメントし、参照カウントが0になるとオブジェクトS3を削除する。インタフェイスA、B、C又はFに対するポインタが返送されるときは、メソッドS3::QueryInterfaceは、制御IUnknownインタフェイスのメソッドS3::AddRefを呼び出し、これは、S3オブジェクトが集合されないときは、メソッドS3::AddRefである。
【0066】
グローバル関数CreateInstanceS3は、クラスS3のオブジェクトのインスタンスを作成する。クライアントは、この関数を呼び出して、クラス3のオブジェクトを具体化する。このため、クライアントは、コンパイル時及び実行時にクラスS3の定義にアクセスせずにクラスS3のオブジェクトを具体化できる。具体化されたオブジェクトS3が、集合オブジェクト、及びクラスS3により提示されたインタフェイスの識別子(iid)に囲まれて戻される場合に、関数CreateInstanceS3には、制御IUnknownインタフェイス(punkOuter)に対するポインタが通される。関数CreateInstanceS3は識別されたインタフェイスに対するポインタ(ppv) を戻す。関数CreateInstanceS3は、パラメータpunkOuter を通すようにメソッドS3::CreateInstanceを呼び出す。メソッドS3::CreateInstanceは、オブジェクトS3を具体化し、オブジェクトS3のIUnknownインタフェイスに対するポインタ(punk)を戻す。関数CreateInstanceS3は、メソッドS3::QueryInterfaceを呼び出し、識別されたインタフェイスに対するポインタを検索する。一時的ポインタpunkは不要になるので、関数CreateInstanceS3は、メソッドS3::Release を呼び出す。
【0067】
メソッドS3::CreateInstanceは、オブジェクトS3を具体化し、オブジェクトS3のIUnknownに対するポインタ(ppunk)を戻す。メソッドS3::CreateInstanceには、制御IUnknownに対するポインタ(punkOuter)が通される。メソッドS3::CreateInstanceは、新たな演算子を使用してオブジェクトS3を具体化する。具体化の間に、構成子S3::S3を呼び出し、パラメータpunkOuter を通す。オブジェクトS3が構成された後、メソッドS3::CreateInstanceは関数CreateInstanceS1を呼び出し、囲まれたオブジェクトS1を作成する。メソッドS3::S3CreateInstanceはパラメータpS3->m punkOuter 及びびIUnknownインタフェイスのインタフェイス識別子を通し、オブジェクトS1のIUnknownインタフェースに対するポインタが返送される。メソッドS3::CreateInstanceは、データメンバS3:: m punkS1内にその返送されたポインタを格納する。メソッドS3::CreateInstanceは、関数CreateInstanceS2を呼び出し、オブジェクトS1の作成と同様の方法でオブジェクトS2を作成する。メソッドS3::CreateInstanceは、メソッドS3::QueryInterfaceを呼び出し、IUnknownインターフェイスに対するポインタを検索する。
【0068】
メソッドS3::AddRefは、オブジェクトS3の参照カウントをインクリメントする。メソッドS3::Release は、参照カウントをディクリメントする。参照カウントが0になると、メソッドS3::Release は、オブジェクトS3を削除する。
【0069】
構成子S3::S3は、データメンバ m A 、 m B 、 m punkouter 及び m refcountを初期化する。構成子S3::S3にはパラメータpunkOuter が通される。データメンバ m A 及び m B の具体化の間に、構成子 A::A 及び B::B が呼び出されそしてオブジェクトS3対応のポインタthisが通される。パラメータpunkOuter の値がNULLであれば、構成子S3::S3は、(新たに具体化したオブジェクトS3を指す)ポインタthisの値にデータメンバ m punkOuter をセットする。パラメータpunkOuter の値がNULLでない場合には、構成子S3::S3はデータメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトS3が囲まれている場合には、集合体の制御IUnknownインタフェイスの値を指し、オブジェクトS3が囲まれていない場合には、オブジェクトS3のIUnknownインタフェイスを指す。構成子S3::S3は、データメンバ m refcountを0に初期化する。
【0070】
消去関数S3::-S3 は、メソッドS1::Release を呼び出して、囲まれたオブジェクトS1の参照カウントをディクリメントする。オブジェクトS1の具体化の間に参照カウントは1にセットされているので、メソッドS1::Release はオブジェクトS1を削除する。消去関数S3::-S3 は、同様の方法でオブジェクトS2の参照カウントをディクリメントする。
【0071】
インタフェイスA及びBは、インタフェイスCのメソッドと同様の動作を有する。従って、インタフェースA及びBは、オブジェクトS3が囲まれた場合に提示できる。
【0072】
図5は、オブジェクトS3のデータ構造レイアウトを示すブロック図である。このデータ構造レイアウトは、インスタンスデータ501、仮想関数表502、503及び504、メソッド505ないし517、オブジェクトS1 401ないし413、及びオブジェクトS2 519を含む。インスタンスデータ501は、制御IUnknownインタフェイスの仮想関数表に対するポインタと、クラスA及びBのインスタンスであるデータメンバ m A 及び m B と、オブジェクトS3のIUnknownインタフェースを指すデータメンバ m punkOuter と、オブジェクトS3対応の参照カウントを含むデータメンバ m refcountと、囲まれたオブジェクトS1のIUnknownインターフェイスを指すデータメンバ m punkS1と、囲まれたオブジェクトS2 519のIUnknownインタフェイスを指すデータメンバ m punkS2とを含む。囲まれたオブジェクトS1が具体化されると、そのデータメンバ S1::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースを指す。同様に、囲まれたオブジェクトS2が具体化されると、そのデータメンバ S2::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースを指す。
【0073】
図6及び図7は、囲んでいるオブジェクトと囲まれたオブジェクトとの共同動作を示すブロック図である。図6は、別のオブジェクトに囲まれていないクラスS1のオブジェクトを示すブロック図である。クラスS1のオブジェクト601はデータメンバ m punkOuter を含み、これはIUnknownインタフェースと、メソッド603、604、605及び606を指す。メソッドIUnknown::QueryInterface603は、要求されたインタフェイスに対するポインタを戻し、参照カウントをインクリメントする。メソッド C::QueryInterface605及び C::AddRef606は、IUnknownインタフェースの対応するメソッドを呼び出す。クラスDのメソッドの実現部(図示せず)は、クラスCと同様である。図7は、クラスS1及びS2のオブジェクトを囲むクラスS3のオブジェクトを示す図である。オブジェクトS2は、オブジェクトS1と同様であり、図示していない。クラスS1のオブジェクト601のデータメンバ m punkOuter 602は、クラスS3のオブジェクト610のIUnknownインタフェイスを指す。メソッドIUnknown::QueryInterface613は、提示された各オブジェクトに対するポインタを返送し、データメンバ m punkS1 619で指示されたメソッドIUnknown::QueryInterface603を呼び出し、インタフェースCに対するポインタを検索する。データメンバ m punkOuter 612は、クラスS3オブジェクト610のIUnknownインターフェイスを指す。クラスA及びBオブジェクトのメソッドQueryInterface615及び617は、データメンバ m punkOuter 612によって示されるメソッドを呼び出す。
【0074】
上述の本発明の実施例において、集合体の制御IUnknownインタフェイスのメソッドQueryInterfaceは、囲まれたオブジェクトのIUnknownインタフェイスのメソッドQueryInterfaceを呼び出し、提示されたインタフェイスに対するポインタを検索する。本発明の別の実施例においては、囲んでいるオブジェクトが提示する囲まれたオブジェクトのインタフェイスに対するポインタを、囲んでいるオブジェクトがキャッシュ処理できる。従って、制御IUnknownのメソッドQueryInterfaceが呼び出されると、このメソッドは、囲まれたオブジェクトのIUnknownインタフェイスのメソッドQueryInterfaceを呼び出すのではなく、制御IUnknownインタフェイスのメソッドAddRefを呼び出した後に、そのキャッシュ処理されたポインタを検索して戻すことができる。この別の実施例を実現するためは、囲んでいるオブジェクトが、各キャッシュ処理されたポインタのデータメンバを定義する。囲まれたオブジェクトが具体化されるときは(一般に囲んでいるオブジェクトの構成中に)、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して、提示されたインタフェイスのポインタを検索する。検索されたポインタは参照カウントされず、囲んでいるオブジェクトが囲まれたオブジェクトに対して1つのポインタ(例えば、S3:: m punkS1)のみを効果的に維持するのが好ましい。囲まれたオブジェクトは、メソッドRelease に対する1回のコールで削除することができる。従って、ポインタがキャッシュ処理された後に、囲まれたオブジェクトのIUnknownインタフェイスのメソッドRelease が呼び出され、そのキャッシュ処理されたポインタに属する参照カウントを除去する。
【0075】
上述の本発明の実施例において、制御IUnknownインタフェイスのメソッドQueryInterfaceの実現部は、どのインタフェイスが提示されるかを指定するswitchステートメントを含む。例えば、メソッドS3::QueryInterfaceのswitchステートメントは、提示された各インタフェイスA、B、C及びFと制御IUnknownに対するcaseラベルを含む。従って、提示されたインタフェイスは囲んでいるオブジェクトの実現中に静的に定義される。別の実施例においては、制御IUnknownインタフェイスメソッドQueryInterfaceは、囲まれたオブジェクトの外部インタフェイスに関する知識が特になくても実現できる。メソッドQueryInterfaceが、実現しないインタフェイスに対するポインタを返送するように要求されたときには、囲まれたオブジェクトのIUnknownインタフェイスのメソッドQueryInterfaceを呼び出し、囲まれたオブジェクトにより実現されれば、その識別されたインタフェイスに対するポインタを検索する。コード表5は、この別の実施例を実現するオブジェクトS3の制御IUnknownのメソッドQueryInterfaceの好ましい実現に対するC++擬似コードである。囲まれたたオブジェクトの外部インタフェイスに対するポインタを戻すことに加えて、制御IUnknownのメソッドQueryInterfaceは、他の全ての外部インタフェイスを提示する一方、特定の外部インタフェースを提示しないように実現できる。
【0076】
上述の実施例において、エラーチェックについては述べなかった。種々の形式ののエラーチェックを実行して、集合体が適切に作成されるよう確保することが望ましい。例えば、囲んでいるオブジェクトが、集合できないオブジェクトを囲もうと試みた場合には、囲んでいるオブジェクトの具体化が失敗に終わる(例えば、関数CreateInstanceS1が欠陥を示すフラグを返送する)。
【0077】
上述の実施例では、集合オブジェクトそれ自体は、囲んでいるオブジェクト内に囲まれたオブジェクトとなり得る。この囲い込み(ネスティング)は、いかなる深さでも起こり得る。或いは又、集合オブジェクトは、非集合可能に実施することもできる。クラスXXに対する関数CreateInstanceXXは、パラメータpunkOuter がナルでない場合、即ち、集合が所望される場合に欠陥を示すフラグを返送することができる。
【0078】
上述の実施例では、集合可能なオブジェクトの各外部インタフェイスに対するオブジェクトは、集合可能なオブジェクトのデータメンバとして具体化される。別の実施例においては、外部インタフェイスは、集合可能なオブジェクトのデータメンバとして実現されるのではなく、集合可能なオブジェクトによって継承される。コード表6は、外部インタフェイスC及びDを有する集合可能なクラスの好ましいクラス定義S1に対するC++擬似コードを含む。クラスS1は、抽象クラスIC及びIDを継承する。インタフェースIC及びIDの実現部は、データメンバ m punkOuter にアクセスするために導出クラスS1に対するポインタを記憶する必要はないが、IUnknownインターフェイス(IUnknownS1)の特殊な非継承の実現部は必要とされる。これに対し、インタフェイスIC及びIDの実現部は、コード表3に示すように、導出クラスS1に対するポインタをデータメンバ m pS1 に記憶する。当業者であれば、インタフェイスの継承を用いた他の実現部も考えられるであろう。
【0079】
動的な集合
動的集合の好ましい実施例においては、インターフェイスのインスタンスは、囲んでいるオブジェクトの形成後の任意の時間にその囲んでいるオブジェクトにこれらインスタンスを追加することによって組み合わされる。このようにして、新たな又は変更されたインターフェイスを既存の(ベース)オブジェクトと組み合わせて、そのベースオブジェクトのコードがコンパイル又はリンクされた後にベースオブジェクトの見掛け上の動作を変更することができる。即ち、ベースオブジェクトの動作(ベースオブジェクトのメソッドにより実行される)は外部には変更されたように見えるが、ベースオブジェクトの動作を実行するメソッドは、実際には変更されていない。ベースオブジェクトは、囲んでいるオブジェクト内に囲み込まれ、その後に、新たな又は変更されたインターフェイスが追加される。
【0080】
外部の要求が特定のインターフェイスにアクセスされるときには、囲んでいるオブジェクトは、どのインターフェイスが返送するかそして一致するインターフェイスが2つ以上ある場合はその要求されたインターフェイスをいかに呼び出すかを決定する役目を果たす。例えば、集合オブジェクトに3つのIPrintインターフェイスが存在する場合には、囲んでいるオブジェクトは、どのIPrintインターフェイスが返送するか、或いはそれ自身のIPrintインターフェイスを返送するかどうかを決定し、これは、他のIPrintインターフェイスのメソッドの組み合わせをいかに呼び出すかを知る。囲んでいるオブジェクトは、固定の又は指定可能な1組の組み合わせルールからこの決定を行うことができる。
【0081】
これらの組み合わせルールは、囲まれたベースオブジェクトの既に定義されたインターフェイスの新たな実現部にアクセスすることによりその囲まれたベースオブジェクトの標準的な動作をオーバーライドするのに使用できる。又、これらのルールは、囲まれたベースオブジェクトの一部分として最初に定義されない能力を追加することによりその囲まれたベースオブジェクトの動作を増強するのに使用することもできる。これらのオーバーライド及び増強能力の両方は、ベースオブジェクトに新たな又は変更されたインターフェイスを追加することによって与えられる。これらの能力に加えて、標準的な囲んでいるオブジェクトは、囲まれたオブジェクトに対するデフォールト動作を実行することができる(囲まれたオブジェクト又は追加されたインターフェイスによって与えられない場合に呼び出すための方法を実行するインターフェイス)。又は、標準的な囲んでいるオブジェクトは、全ての囲まれたオブジェクトに対して典型的に存在する方法(プリンティングのような)に対する制御(オーバーライド)動作を実行することができる。
【0082】
好ましい実施例では、クライエントプログラムの実行中にインターフェイスのインスタンス(オブジェクトによって実行される)を一緒に集合できるようにすることによりオブジェクトを動的に変更することができる。オブジェクトを具体化するコンピュータプログラムは、クライエントプログラムである。集合は、それらの各々のインターフェイスを囲んでいるオブジェクト内に囲い込むことにより多数の異なるオブジェクトの能力を組み合わせるプロセスである。囲んでいるオブジェクトは、次いで、制御IUnknownインターフェイスの囲んでいるオブジェクトの実現部により提示しようとする全てのインターフェイスへのアクセスを支援するという役目を果たす。
【0083】
静的な集合では、囲んでいるオブジェクトは、それが集合しようとするインターフェイス(オブジェクト)を前もって知る必要があった。静的な集合を用いると、プログラマは、囲んでいるオブジェクトが提示しなければならないのはその集合オブジェクトインターフェイスのどれかを前もって判断し、そしてその囲んでいるオブジェクトの制御IUnknownのQueryInterfaceメソッドを実施して、これらの提示されたインターフェイスに対するポインタを要求時に返送する。制御IUnknownのQueryInterfaceメソッドは、個々の囲まれたオブジェクトの対応するIUnknownインターフェイスに対する参照を維持することによりこのタスクを実行する。(これらの参照は、囲んでいるオブジェクトが、囲まれたオブジェクトを具体化するときに形成される。)1つの囲まれたオブジェクトの提示されたインターフェイスを参照するための要求が受け取られたときには、制御IUnknownのQueryInterfaceメソッドは、その要求に応答するために、囲まれたオブジェクトの対応するIUnknownインターフェイスを呼び出す。囲まれたオブジェクトは、囲んでいるオブジェクトがどのインターフェイスを提示するか知らないので、囲まれたオブジェクトによって受け取られる全ての外部要求は、囲んでいるオブジェクトへ通され、これにより、一緒に集合された他の囲まれたオブジェクトにおいて定義されたインターフェイスへアクセスできるようにする。
【0084】
本発明は、インターフェイスの動的な集合も支援する。好ましい実施例では、囲んでいるオブジェクトは、具体化されたインターフェイスを登録しそしてそれらに対する参照を後で検索するメソッドを与える。更に、集合オブジェクトからインターフェイスが要求されたときには、本発明は、同じインターフェイスの2つ以上のインスタンスが集合オブジェクトに存在する場合にどのインターフェイスを検索しそしてそれらをいかに組み合わせて呼び出すかの判断を変更するためのメソッドを提供する。
【0085】
好ましい実施例において、動的な集合は、マルチタイプオブジェクトを用いて実施される。マルチタイプオブジェクトとは、種々のタイプのオブジェクト、ひいては、その名前を集合することのできるオブジェクトをいう。集合できるようにコード化されたインターフェイスのみをマルチタイプオブジェクト内に囲むことができる。(即ち、例えば、このようなインターフェイスは、インターフェイス及び参照カウント要求を、囲んでいるオブジェクトへ送ることができる。)マルチタイプオブジェクトは、特定のインターフェイス又はオブジェクトの集合を要求すると共に、要求されたインターフェイスをいかに呼び出すかを判断するためのルールを追加するIMultitypeインターフェイスを与える。以下のコード表7は、IMultitypeインターフェイスの好ましい定義のための擬似コードを含んでいる。
【0086】
図8、9、10は、マルチタイプオブジェクトに2つのオブジェクトを追加するシーケンスのブロック図である。図8は、マルチタイプオブジェクトのインスタンスを示すブロック図である。オブジェクトMTO 7A01は、提示されたインターフェイスであるIMultitypeインターフェイスMT及び制御IUnknownを実行する。マルチタイプオブジェクトに外部インターフェイスが追加されるときには、マルチタイプオブジェクトが集合オブジェクトとなる。マルチタイプオブジェクトの実現部は、それが集合に追加したインターフェイスのリスト7A02、7A09及び7A10を含んでいる。マルチタイプオブジェクトは、これらのリストを用いて、マルチタイプオブジェクトの制御IUnknownインターフェイスによりその囲まれた集合オブジェクトの種々のインターフェイスを呼び出す。又、マルチタイプオブジェクトは、インターフェイスリスト7A02、7A09及び7A10からインターフェイスをアクセスしそして組み合わせるためのルールのリスト7A11も含んでいる。
【0087】
これらの異なるリストの相互作用により、マルチタイプオブジェクトの強力な能力が与えられる。AddRule メソッドを用いて固定又は指定することができるルール7A11のリストは、特定のインターフェイスに対する異なるインターフェイスリストの相互作用及び使用を指定する。従って、他のルールを選択するためのルールと、特定のインターフェイスを選択して組み合わせるためのルールとが存在する。3つの異なるインターフェイスリスト7A02、7A09及び7A10は、オーバーライド、増強、デフォールト及び制御能力を支援するために設けられている。マルチタイプオブジェクトにインターフェイスが追加されるときには、集合を形成するクライエントプログラムが、インターフェイスの追加に使用すべきリストを指定する。リスト7A02は通常のリストを構成し、リスト7A09はデフォールトリストを構成し、そしてリスト7A10はオーバーライドリストを構成する。基本的に、オーバーライドリストは、通常のリスト上のインターフェイスの前にアクセスする必要のあるインターフェイスを指すことによりオーバーライド及び制御能力を実行するよう意図される。デフォールトリストは、オーバーライドリスト及び通常リストが要求されたインターフェイスを含まないときだけアクセスされるインターフェイスを指示するように意図される。これらのリストの相互作用については、IRule インターフェイスの説明において詳細に述べる。
【0088】
図9は、AddObject メソッドを用いてIBasicインターフェイスを集合した後のマルチタイプオブジェクトMTOを示すブロック図である。AddObject メソッドは、指定されたオブジェクトの全てのインターフェイスをマルチタイプオブジェクトに追加する。集合オブジェクトMTO 7B01は、図8を参照して述べたマルチタイプインターフェイスと、囲まれたスプレッドシートオブジェクトS17B04とを備えている。囲まれたオブジェクトS1は、外部インターフェイスIBasic (B)のインスタンスと、外部インターフェイスIPrint (P)のインスタンスと、IUnknownのインスタンスとを実行する。(外部インターフェイスとは、囲んでいるオブジェクトによって提示されるオブジェクトのインターフェイスである。内部インターフェイスとは、囲んでいるオブジェクトによって提示されないオブジェクトのインターフェイスである。)囲まれたオブジェクトS1がマルチタイプオブジェクトMTOの通常のリストに追加されたときには、集合されたインターフェイス7B02の通常のリストが、囲まれたオブジェクトS1のIUnknownインターフェイスを識別する単一エレメント7B03を含む。S1のIUnknownインターフェイスは、要求があったときに外部インターフェイスB及びPにポインタを返送する。S1は集合可能であるから、S1が具体化されるときには、これがポインタ7B05を、囲んでいるオブジェクトMTOへ通し、これは、オブジェクトMTOの一部として集合された他のインターフェイスをアクセスするために後で使用することができる。
【0089】
図10は、AddObject メソッドを用いてIDatabase インターフェイスを追加した後の結果のマルチタイプオブジェクトMTOを示すブロック図である。この点において、集合オブジェクトMTO 7C01は、図8について述べたIMultitypeインターフェイスと、図9について述べた囲まれたスプレッドシートオブジェクトS1と、データベース能力を実行する囲まれたデータベースオブジェクトS2 7C07とを備えている。囲まれたオブジェクトS2は、外部インターフェイスIDatabase (D) のインスタンスと、IUnknownのインターフェイスとを実行する。IMultitypeインターフェイスのAddObject メソッドを用いてマルチタイプオブジェクトMTOに囲まれたオブジェクトS2が追加されたときには、集合されたインターフェイス7C02の通常のリストは、2つのエレメント7C03及び7C06を含む。エレメント7C06は、囲まれたオブジェクトS2のIUnknownインターフェイスを識別する。S1と同様に、S2のIUnknownインターフェイスは、外部インターフェイスDに対するポインタを返送することができ、囲んでいるオブジェクトMTOに対するポインタ7C08を他のMTOインターフェイスへのアクセスのために含んでいる。
【0090】
追加されたインターフェイス及びオブジェクトを追跡するのに使用されるデータ構造体の多数の他の実施例が考えられることが当業者に明らかであろう。例えば、使用するリストの数及び種類を変更することができる。特に、1つのリストしかもたないようにすることもできるし、オーバーライド又はデフォールトリストを任意に形成することもできる。又、全オブジェクトが集合されるときには、各リストエレメントが集合されるべき正確なインターフェイスのみを指示し、IUnknownのオブジェクトは指示しないようにすることもできる(AddInterface型のマルチタイプオブジェクトのみをサポートする)。或いは又、どのインターフェイスが集合に追加されるかに係わりなく、各リストエレメントがIUnknownのオブジェクトを指すことを必要とすることもできる(AddObject 型のマルチタイプオブジェクトのみをサポートする)。更に、インターフェイス識別子の種々の記憶されたリスト又はハッシュテーブルを含む他のリスト実現を使用することもできる。
【0091】
コード表8は、図8ないし10のオブジェクトS1の好ましいクラス定義に対するC++擬似コードを含み、これは、S1オブジェクトのインスタンスを形成するグローバルな関数と共に集合(集合オブジェクト)内に囲むことのできるものである。クラスIUnknown、IBasic及びIPrintは、S1を構成する各インターフェイスのメソッドを定義するインターフェイスである。クラスS1は、IUnknownインターフェイス、IBasicインターフェイス及びIPrintインターフェイスを実施する。IBasic及びIPrintインターフェイスは、外部インターフェイスとして実施される。
【0092】
図11は、クラスS1のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。インスタンス構造801は、クラスS1(m B 、m P 、m punkOuter)のデータメンバと、仮想関数表ポインタ(S1::vfptr) とを含んでいる。データメンバm B 及びm P は、各々、クラスB及びPのオブジェクトのインスタンスである(これらは、インターフェイスIBasic及びIPrintのクラス実施である)。データメンバm B 及びm P はクラスS1のフレンドであり、m B 及びm P オブジェクトがm punkOuter のようなクラスS1のプライベートメンバにアクセスできるようにする。仮想関数表ポインタS1::vfptr は仮想関数表802を指し、データメンバm B 内の仮想関数表ポインタS1::B::vfptrは仮想関数表803を指し、データメンバm P 内の仮想関数表ポインタS1::P::vfptrは仮想関数表804を指す。仮想関数表802は、制御IUnknownインターフェイスに対して定義された仮想関数(メソッド)のポインタを含み、仮想関数表803は、IBasicインターフェイスに対して定義された仮想関数のポインタを含み、そして仮想関数表804は、IPrintインターフェイスに対して定義された仮想関数のポインタを含む。メソッド805ないし809は、クラスS1の関数メンバである。メソッド808はクラスS1の構成子である。メソッド809はクラスS1のCreateInstanceメソッドである。メソッド810ないし818はクラスBの関数メンバである。メソッド813はクラスBの構成子である。メソッド819ないし823はクラスPの関数メンバである。メソッド823はクラスPの構成子である。図11は、集合の部分ではないS1オブジェクトのインスタンスを示しているので、データメンバS1::B::m pS1 、S1::P::m pS1 及びS1::m punkOuter(囲んでいるオブジェクトに対するポインタ)は、S1オブジェクト自体を指すように初期化される。
【0093】
コード表8によって定義されたオブジェクトS1は、静的な集合を参照して述べた集合オブジェクトの要件に合致する。動的な集合を行う目的で、コード表8は、S1をその囲んでいるオブジェクトとその集合時にいかに自動的に通信できるか及び関数S1::QueryInterfaceから何が返送されるかを示している。より詳細には、S1オブジェクトの形成時に、囲んでいるマルチタイプオブジェクトの制御IUnknownインターフェイスのポインタがメソッドCreateInstanceへ通される。このポインタは、次いで、S1の外部インターフェイス(IBasic及びIPrint)のメソッドQueryInterfaceによって使用され、インターフェイス要求をその囲んでいるマルチタイプオブジェクトへルート指定する。S1インターフェイスがその閉じているマルチタイプオブジェクトから要求されたときには、その閉じているマルチタイプオブジェクトの制御IUnknownのメソッドQueryInterfaceがメソッドS1::QueryInterfaceを呼び出し、これは、インターフェイスIBasic、インターフェイスIPrint又はインターフェイスIUnknownの適当なインスタンスに対するポインタを返送し、そしてS1オブジェクトの参照カウントを適宜に増加する。(S1::QueryInterfaceを呼び出すために囲んでいるマルチタイプオブジェクトによって使用されるメカニズムは、以下で詳細に説明する。)
【0094】
当業者であれば、囲んでいるマルチタイプオブジェクトの制御IUnknownインターフェイスのポインタを集合オブジェクトへ通すために多数の別の態様が存在することが明らかであろう。例えば、形成時にポインタを通すのではなく、特に、このポインタを通すためのメソッドを定義することができる。この実施例を用いる場合に、オブジェクトは、いったん集合されると、後で集合解除することもできるし、或いはオブジェクトを後で異なる囲み込みオブジェクトへ集合することができる。
【0095】
コード表8が図8ないし10に示したようにマルチタイプオブジェクトといかに相互作用するかを理解するために、クライエント要求がなされるときのコールシーケンスについて調べるのが有用であろう。以下のコード表9は、クライエントがマルチタイプオブジェクトMTOのポインタを有するときにクライエントアプリケーションがIBasicインターフェイスを要求するときの図8に対応するコールの擬似コードシーケンスを示している。
コード表9
MTO::QueryInterface(IID Ibasic, ppv)
これは、IBasicインターフェイスをサポートする集合されたオブジェクトを見つける。
S1::IUnknown::QueryInterface(IID IBasic,ppv)
これは、B インターフェイスにポインタを返送する。
第1のコール(MTO::QueryInterface) において、MTOは、集合されたインターフェイスのリストから、どのオブジェクトのQueryInterfaceメソッドを呼び出すかを決定し、次いで、第2のコール(S1::IUnknown::QueryInterface)においてそれを呼び出す。
【0096】
コード表10は、クライエントアプリケーションが、囲んでいるマルチタイプオブジェクトのポインタではなくて、囲まれたオブジェクトのインターフェイス(S1のIPrintインターフェイスのような)の1つに対するポインタを有する場合に、コールの擬似コードシーケンスがいかに変化するかを示している。
コード表10
P::QueryInterface(IID IBasic,ppv)
これは、囲んでいるオブジェクトにコールを送る。
MTO::IUnknown::QueryInterface(IID IBasic,ppv)
//m punkOuter はMTO::IUnknown を指す。
これは、IBasicインターフェイスをサポートする集合されたオブジェクトを見つける。
S1::IUnknown::QueryInterface(IID IBasic,ppv)
これは、B インターフェイスにポインタを返送する。
コード表10は、集合がその囲んでいるオブジェクトへいかに自動的に要求を送ってその集合内の他のインターフェイスをアクセスするかを示すものである。この場合に、囲まれたオブジェクトのQueryInterface関数は、囲んでいるオブジェクト(MTO)のQueryInterfaceメソッドへ要求を送る。次いで、MTO::QueryInterface メソッドは、コード表9のように機能する。
【0097】
IDatabase インターフェイスを実行するS2オブジェクトは、上記したS1オブジェクトと同様である。
【0098】
コード表11は、インターフェイスを動的に集合するのに使用できるマルチタイプオブジェクトの好ましいクラス定義に対するC++擬似コードである。クラスMTOは、マルチタイプオブジェクトに対しIMultitypeインターフェイス及び制御IUnknownインターフェイスのインスタンスを実行する。
【0099】
グローバルな関数CreateInstanceMTO は、クラスMTOのオブジェクトのインスタンスを形成する。クライエントはこの関数を呼び出し、クラスMTOのオブジェクトを具体化する。この関数を用いて、クライエントは、コンパイル時間又はランタイムにMTOクラス定義をアクセスすることなくクラスMTOのオブジェクトを具体化することができる。関数CreateInstanceMTO には、具体化されたMTOオブジェクトが別のオブジェクト内に集合されたときに制御IUnknownインターフェイス(punkOuter) に対するポインタが通される。この関数は、パラメータpunkOuter に沿って通されるメソッドMTO::CreateInstance を呼び出す。
【0100】
メソッドMTO::CreateInstance は、MTOオブジェクトを具体化し、MTOオブジェクトのIUnknownインターフェイスに対するポインタ(ppunk) を返送する。このインターフェイスは、次いで、関数CreateInstanceMTO によって使用され、クライエントアプリケーションにより実際に要求されたインターフェイスを返送することができる。メソッドMTO::CreateInterfaceは、新たな演算子を使用してMTOオブジェクトを具体化する。具体化の間に、構成子MTO::MTOが呼び出されそしてパラメータpunkOuter の値が通される。
【0101】
構成子MTO::MTOは、データメンバ m MT及び m punkOuter を初期化する。クラスMTのデータメンバ m MTの具体化の間に、構成子MT::MTが呼び出され、MTOオブジェクトに対するこのポインタが通される。(C++において、このポインタは、オブジェクトのインスタンスそれ自体を指す。)構成子MT::MTは、次いで、MTOクラスを再び指すようにローカル変数をセットする。構成子MTO::MTOには、パラメータpunkOuter が通される。punkOuter の値がナルの場合には、構成子MTO::MTOは、新たに具体化されたMTOオブジェクトを指すようにデータメンバ m punkOuter をセットする。他方、punkOuter がナルでない場合、例えば、オブジェクトが大きな集合の一部として集合された場合は、構成子MTO::MTIO は、データメンバ m punkOuter をパラメータpunkOuter の値にセットする。即ち、データメンバ m punkOuter は、MTOオブジェクトが囲まれたときには集合の制御IUnknownインターフェイスの値を指し、そしてMTOオブジェクトが囲まれないときにはMTOオブジェクトのIUnknownインターフェイスを指す。
【0102】
MTOオブジェクトによって実行されるIMultitypeインターフェイスは、4つのメソッドAddObject 、AddInterface、AddRule 及びEnumを含んでいる。メソッドAddObject は、マルチタイプオブジェクト内に囲まれるべきオブジェクトを追加するという役割を果たす(全てのオブジェクトインターフェイスはアクセス可能とされる)。これは、図12を参照して説明する。メソッドAddInterfaceは、マルチタイプオブジェクトに単一のインターフェイスインスタンスを追加する役目を果たす。メソッドAddInterfaceはメソッドAddObject に関連して説明する。メソッドAddRule は、クライエントアプリケーションが特定のインターフェイス識別子を要求するときに問い合わせすべきオブジェクト又は返送すべきインターフェイスのどの組み合わせかを決定するのに使用される組み合わせルールをクライエントアプリケーションが指定できるようにする。これは、ルールオブジェクトに関連して詳細に説明する。メソッドEnumは、マルチタイプオブジェクトによって維持される種々のインターフェイスリストを列挙するためにルールオブジェクトによって使用される。このメソッドは、ルールオブジェクトに関連して詳細に説明する。
【0103】
図12は、マルチタイプオブジェクトによって実行されるIMultitypeインターフェイスのメソッドAddObject の流れ線図である。図12は、コード表11に示されたAddObject のコードに対応する。メソッドAddObject は、オブジェクトの全てのインターフェイスへのマルチタイプオブジェクトアクセスに動的に追加するようにクライエントアプリケーションにより使用される。このメソッドには、どのリストにオブジェクトを追加するかを指示するリスト指示子と、オブジェクトを指定のリストのヘッド又はテイルに追加しなければならないかどうかの指示と、集合すべきオブジェクトのIUnknownインターフェイスに対するポインタとが通される。このメソッドは、メソッドAddInterfaceと共に、マルチタイプオブジェクトによって囲まれるオブジェクト及びインターフェイスに関する情報を維持するための構造を実施する。
【0104】
1つの典型的な実施は、囲まれたオブジェクトのインターフェイスを各々指すエレメントで形成されたリスト構造を使用する。全オブジェクトを囲むためにメソッドAddObject が呼び出されたときには、指定のリスト構造に新たなエレメントが追加され、新たなエレメントは、囲まれたオブジェクトのIUnknownインターフェイスを指す。このIUnknownインターフェイスは、次いで、囲まれたオブジェクトの成分インターフェイスをアクセスするのに使用することができる。一方、オブジェクトの単一インターフェイスを囲むためにメソッドAddInterfaceが呼び出された場合には、指定のリスト構造に新たなリストエレメントが追加され、この新たなエレメントは、この単一インターフェイスに直接アクセスできるようにこの単一インターフェイスを指す。典型的な実施において、各リストエレメントは、インターフェイス識別子によって指示され、囲まれたオブジェクトのインターフェイスを指し、そしてそのリスト内の次のエレメントを指す。クライエントはリストのヘッド又はテイルのいずれかに追加できるので、二重にリンクされたリストを用いて効率を上げることができる。
【0105】
メソッドinvocation(呼び出し)において、クライエントアプリケーションはアプリケーションが指定のインターフェイス又はオブジェクトを追加したいのはどのリストかを指定する。「通常」リストは、クライエントアプリケーションがインターフェイス又はオブジェクトを集合に単に追加しようとするときに用いられる。「オーバーライド」リスト及び「デフォールト」リストは、クライエントアプリケーションがインターフェイスを追加しようとし、そのメソッドが通常リストにおけるものとは異なる時間に呼び出されるときに、使用される。典型的な実施においては、特定のインターフェイスが要求されたときに、マルチタイプオブジェクトの制御IUnknownのメソッドQueryInterfaceは、要求されたインターフェイスサーチリストを、最初にオーバーライドリストを介して、第2に通常リストを介してそして第3にデフォールトリストを介して返送する。当業者であれば、リスト構造の番号を変え、サーチ順序を変えそして要求されたインターフェイスとの一致を何が構成するかの判断を変えることを含む多数の他の実施及びサーチ戦略が明らかであろう。以下に述べる好ましい実施例では、クライエントアプリケーションは、決定ルールを変更する。
【0106】
図12のステップは、指定のリストにエレメントをいかに追加するかを示している。ステップ901において、このメソッドは新たなリスト項目を割り当て、そしてステップ902においてその項目を初期化して、クライエントアプリケーションが集合しようとするインターフェイスを含むオブジェクトのIUnknownインターフェイスを指すと共に、その項目のインターフェイス識別子を含むようにする(IUnknownインターフェイスを指示するために)。ステップ903において、このメソッドは、通常リストが指定されたかどうか判断する。もしそうならば、このメソッドはステップ904に続き、さもなくば、ステップ907に続く。ステップ904において、このメソッドは、クライエントアプリケーションが通常リストのヘッドにエレメントを挿入しようとしているかどうかを判断する。もしそうならば、メソッドはステップ905に続き、さもなくば、ステップ906に続く。ステップ905では、このメソッドは、初期化されたエレメントを通常リストのヘッドに挿入し、そして復帰する。ステップ906では、初期化されたエレメントを通常リストのテイルに挿入しそして復帰する。ステップ907ないし914は、オーバーライド及びデフォールトリストについて同様に作用する。
【0107】
IMultitypeインターフェイスのメソッドAddInterfaceは、メソッドAddObject と同様に機能する。その主たる相違は、追加されたリストエレメントが、囲まれるべきオブジェクトの指定のIUnknownインターフェイスを指すのではなくて、追加されたリストエレメントが指定のインターフェイスを指しそして通されたインターフェイス識別子を指示する。このように、オブジェクトの単一の単一インターフェイスを、他のインターフェイスを提示せずに、集合することができる。
【0108】
コード表11に戻ると、IMultitypeインターフェイス(継承されたIUnknownインターフェイス)のメソッドQueryInterface、AddRef及びRelease は、このIMultitypeインターフェイスを実施する親オブジェクト(MTO)のIUnknownインターフェイスに要求を送る。
【0109】
MTOオブジェクトにより実施される制御IUnknownインターフェイスは、メソッドQueryInterface、AddRef及びRelease を含む。メソッドAddRef及びRelease は、マルチタイプオブジェクトの参照カウントを実行する。参照カウントがゼロのときには、MTOオブジェクトが削除される。
【0110】
図13は、マルチタイプオブジェクトに対する制御IUnknownインターフェイスのメソッドQueryInterfaceの流れ線図である。図13は、コード表11に示されたQueryInterfaceに対するコードに対応する。メソッドQueryInterfaceは、要求されたインターフェイスを、それ自身の実施についての知識と、集合されたインターフェイスリストからの情報とを用いて位置決めする。このメソッドは、要求されたインターフェイス識別子である入力パラメータを取り上げ、そして要求されたインターフェイスに対するポインタを出力する。ステップ1001ないし1004において、このメソッドは、要求されたインターフェイスがマルチタイプオブジェクト自体によって実施されたものであるかどうかを判断する。さもなくば、ステップ1005ないし1014において、このメソッドは、要求されたインターフェイスを見つけるまで、各々の囲まれたオブジェクト又はインターフェイスをサーチする。
【0111】
ステップ1001において、このメソッドは、要求されたインターフェイス識別子がIID IMultitypeに等価であるかどうかを決定し、もしそうであれば、ステップ1002に続き、さもなくば、ステップ1003に続く。ステップ1002では、このメソッドは、オブジェクトMTOにより実施されたIMultitypeのインスタンスを指すように出力パラメータをセットし、そして復帰する。ステップ1003では、このメソッドは、要求されたインターフェイス識別子がIID IUnknownに等価であるかどうかを決定し、もしそうであれば、ステップ1004に続き、さもなくば、ステップ1005に続く。ステップ1004では、このメソッドは、マルチタイプオブジェクトによって実施されるIUnknownのインスタンスであるこのポインタに出力パラメータをセットし、そして復帰する。
【0112】
ステップ1005ないし1014では、このメソッドは、要求されたインターフェイスに一致するインターフェイスを指す第1のリストエレメントをサーチするように3つのリストをループする。このインスタンスが見つかったときには、それがパラメータppv において返送され、そしてこのメソッドは首尾良い状態を返送する。この実施は、使用できる多数の形式のサーチの一例に過ぎないことが当業者に明らかであろう。ステップ1005において、一時的なリスト指示子はマルチタイプオブジェクトによって実施されるリストの組からの次のリストにセットされる。好ましい実施例において、このリストの組は、オーバーライド、通常、及びデフォールトリストを含む。ステップ1006において、このメソッドは、現在リストの前部を指すように一時的な変数項目をセットする。ステップ1007において、このメソッドは、現在リスト内の全てのエレメントを排出しそして一致インスタンスがまだ見つからないかどうかを決定する。このメソッドが現在リストの終わりに達した場合には、この方法はステップ1008に続き、さもなくば、ステップ1009に続く。ステップ1008において、このメソッドは、更に多くのリストがサーチに使用できることを決定すると、ステップ1005に戻って、新たなリストのサーチを開始する。さもなくば、このメソッドは、一致するインターフェイスが見つからないので、不首尾の状態を返送する。ステップ1009において、このメソッドは、一時的な変数pitem によって指された現在リストエレメントがIUnknownインターフェイスを指すかどうか決定し、もしそうならば、ステップ1010へ続き、さもなくば、ステップ1013へ続く。(現在リストエレメントがIUnknownインターフェイスを指す場合には、このインターフェイスに対応するオブジェクトは、一致インターフェイスのために更に問い合わせされる必要がある。)ステップ1010において、このメソッドは、現在リストエレメントによって指されたIUnknownインターフェイスのメソッドQueryInterfaceを呼び出す。ステップ1011において、このメソッドは、要求されたインターフェイス識別子が見つかったかどうか決定し、もしそうでなければ、ステップ1012へ続き、さもなくば、復帰する。要求されたインターフェイス識別子が見つからない場合には、QueryInterfaceコールが、返送パラメータppv を、要求されたインターフェイスを指すように既にセットしている。この場合にこのメソッドは、首尾良い状態を返送する。さもなくば、ステップ1012において、このメソッドは、リスト内の次のエレメントを指すように現在リストエレメントポインタ(pitem) をインクレメントし、そしてステップ1007に続き、現在リスト構造を通してサーチする。ステップ1013において、このメソッドは、要求されたインターフェイス識別子を、現在リストエレメントのインターフェイス識別フィールドと比較し、それらが同じであれば、ステップ1014へ続き、さもなくば、サーチを伴うステップ1012へ続く。ステップ1014ではこのメソッドは、返送パラメータppv を、要求されたインターフェイスを(現在リストエレメントにより指された)指すようにセットし、そして首尾良い状態を復帰する。
【0113】
図14は、IBasic、IPrint及びIDatabase インターフェイスがメソッドAddObject を用いて動的に集合された後の図10に対応するマルチタイプオブジェクトのデータ構造レイアウトを示すブロック図である。データ構造レイアウトは、インスタンスデータ1101、仮想関数表1104及び1105、メソッド1107ないし1115、並びに現在囲まれている(集合されたオブジェクト)のインスタンスを備えている。インスタンスデータ1101は、制御IUnknownインターフェイスに対する仮想関数表のポインタと、クラスMTのインスタンス(IMultitypeインターフェイスの実施)であるデータメンバ m MTと、MTOオブジェクトのIUnknownインターフェイスを指すデータメンバ m punkOuter と、現在追加されたインターフェイスの通常リストのヘッドを指すデータメンバ m pnormal itemheadとを含んでいる。図示されたように、リストは現在2つのエレメントを含んでいる。リストエレメント1102は、S1オブジェクト801ないし823(図11で定義された)を指し、そしてリストエレメント1103は、S2オブジェクト1106のインスタンスを指す。図示されていないが、マルチプルオブジェクトは、空のデフォールトリスト及びオーバーライドリストに対するポインタも指す。
【0114】
囲まれたS1オブジェクトが具体化されるときには、そのデータメンバS1:: m punkOuter が、MTOオブジェクトのIUnknownインターフェイスを指すように初期化される。同様に、囲まれたS2オブジェクトが具体化されるときには、そのデータメンバS2:: m punkOuter が、MTOオブジェクトのIUnknownインターフェイスを指すように初期化される。このタスクは、上記のように、CreateInstanceXX関数(但し、XXはS1又はS2)におけるMTOのポインタを通すことによって行われる。
コード表12
MTO *pMTO;
IMultiType*my pMT;
IUnknown*pSpreadSheet,*pDataBase;
CreateInstanceMTO(NULL,IID IUnknown,pMTO);
CreateInstanceS1(pMTO,IID IUnknown,pSpreadSheet);
CreateInstanceS2(pMTO,IID IUnknown,pDataBase);
pMTO->QueryInterface(IID Multitype,my pMT);
my pMT->AddObject(IID ISpreadSheet,NORMAL LIST,true,pSpreadSheet)
my pMT->AddObject(IID IDataBase,NORMAL LIST,true,pDataBase);
...
//ある時間の後に、他のあるクライエントがスプレッドシートオブジェクトのデ//ータベース能力を呼び出すことができる。
pSpreadSheet->QueryInterface(IID IDaraBase,ppv);
ppv->Data();
【0115】
コード表12は、1組のインターフェイスを動的に集合するためのステップの好ましいリストに対する擬似コードを含んでいる。この例は、オブジェクトの全てのインターフェイスを追加するためのメソッドAddObject を用いて図10に示すIBasic、IPrint及びIDatabase のインスタンスを追加することに対応する。第1に、関数CreateInstanceMTO を用いて新たなマルチタイプオブジェクトが割り当てられる。この関数を用いると、IUnknownインターフェイスが、新たに具体化されたマルチタイプオブジェクトに対し検索される。このインターフェイスは、S1及びS2オブジェクトが、囲んでいるマルチタイプオブジェクトをアクセスできるように具体化されたときにこれらS1及びS2オブジェクトに通される。ある点において、S1オブジェクトのインスタンスが形成され、マルチタイプオブジェクトに対するポインタがそこに通される。又、S2データベースオブジェクトのインスタンスが形成され、マルチタイプオブジェクトに対するポインタがそこに通される。S1及びS2のインスタンスが形成された後に、IMultitypeインターフェイスがマルチタイプオブジェクトから検索される。このインターフェイスは、スプレッドシート及びデータベースインターフェイスをマルチタイプオブジェクトに動的に追加するのに使用される。次いで、マルチタイプオブジェクトのIMultitypeインターフェイスのメソッドAddObject が呼び出されて、S1及びS2オブジェクトがマルチタイプオブジェクトへと集合される。これらのオブジェクトがマルチタイプオブジェクトに囲まれると、マルチタイプオブジェクトのいずれかのインターフェイス又はその囲まれたオブジェクトのいずれかを用いて、集合オブジェクト内の他のインターフェイスをアクセスすることができる。コード表2は、基本的なスプレッドシートオブジェクト(S1)を用いてデータベースインターフェイスを検索しそしてこのIDatabase インターフェイスのデータメソッドを呼び出すという例を示している。
【0116】
コード表13は、ルールオブジェクトのリストをサポートするために増強されたマルチタイプオブジェクトに対する好ましいクラス定義のC++擬似コードを含んでいる。これらのルールオブジェクトは、マルチタイプオブジェクトの要求されたインターフェイスを組み合わせるための組み合わせルール、又はルールオブジェクトのリストからルールオブジェクト(組み合わせルールを含む)を選択するための選択ルールのいずれかを含むことができることを想起されたい。各ルールオブジェクトは、ルールオブジェクトをマルチタイプオブジェクトにフックするためのIRule インターフェイスのインスタンスを実行する。又、各ルールオブジェクトは、ルールオブジェクトが組み合わせルールを与えるところのインターフェイスのインスタンスも実行する。例えば、全ての囲まれた集合されたオブジェクトのプリントを整合するために、IPrintインターフェイスの組み合わせルールを実施するルールオブジェクトを設けることができる。このようなルールオブジェクトは、IRule インターフェイスの実施と、IPrintインターフェイスの実施とを含む。この特定例は、コード表14を参照して以下に詳細に述べる。
【0117】
又、コード表13は、ルールオブジェクトのリストからルールオブジェクトを選択する選択ルールを含むルールオブジェクトに対する好ましいクラス定義のC++擬似コードも示している。簡単な例にするために、このルールオブジェクトによって与えられるルールは、ルールオブジェクトのリスト(MTO::QueryInterface により定められた)からルールオブジェクトをアクセスするためにマルチタイプオブジェクトによって使用されるデフォールトコードに類似している。しかしながら、この選択ルールオブジェクトは、ルールオブジェクトをアクセスするためのいかなるルールも実施できることが当業者に明らかであろう。
【0118】
コード表13に示すように、マルチタイプオブジェクトは、2つのインターフェイスIMultitype及びIUnknownを実行する。これらのインターフェイスは、以下に述べるものを除いて、コード表11に示したものと本質的に同じである。コード表13に示されたコード表11からの基本的な変更は、制御IUnknownのメソッドQueryInterface(MTO::QueryInterface) が、固定の1組のルールに基づき一致インターフェイスに対して囲まれたインターフェイスの3つのリストをもはやサーチしないことである。(図14に示された固定のルールは、オーバーライド、通常及びデフォールトリストから最初に見つかったインターフェイスをその順序で返送することである。)むしろ、MTOオブジェクト自体によって実施されないインターフェイスが要求されたと決定されると、MTO::QueryInterface は、その要求されたインターフェイスに対応するルールオブジェクトがルールオブジェクトのMTOオブジェクトリストに存在する場合はそこまで要求を延期する。見つかったルールオブジェクトは、次いで、要求されたインターフェイスの実施を与えるか又は集合されたインターフェイスのMTOオブジェクトの3つのリストからインターフェイスを返送する役割を果たす。従って、クライエントアプリケーションは、特定のインターフェイスを検索するか又は組み合わせるそれ自身のルールオブジェクトを設けることにより、集合されたオブジェクトの制御IUnknownのメソッドQueryInterfaceの動作を変更することができる。これらのルールオブジェクトは、マルチタイプオブジェクトの実施とは独立して実施できる。というのは、それらは、囲まれたインターフェイス及びルールリストをアクセスするためにマルチタイプオブジェクトによって与えられたパブリック・エニュメレーションメソッドを使用できるからである。更に、クライエントアプリケーションは、IUnknownインターフェイスに対するルールオブジェクトを設けることにより要求されたインターフェイスに対応するルールオブジェクトを見つけるためにMTO::QueryInterface により使用される選択ルールを変更することができる。
【0119】
コード表11を参照して既に述べたメソッドAddObject 及びAddInterfaceに加えて、クラスMTOは、ルールオブジェクトを取り扱うための2つのメソッド、AddRule 及びEnumを与える。メソッドAddRule は、AddInterfaceと同様に実行される。メソッドAddRule は、ルールオブジェクトのリストに対して新たなリスト項目を形成し、そして入力パラメータとして通されたルールオブジェクトのインターフェイス識別子及びIRule インターフェイスを指すようにこの項目を初期化する。このメソッドは、次いで、ルールオブジェクトのリストに新たなリスト項目を挿入し、そしてその新たなリスト項目により指されたIRule インターフェイスのメソッドInitを呼び出し、MTOオブジェクトに戻るルールオブジェクトアクセスを与える。このようなアクセスは、インターフェイスの他のリストをアクセスするためのメソッドEnumを呼び出すようにルールオブジェクトによって使用される。
【0120】
図示されたように、メソッドAddRule は、ルールオブジェクトのリストの終わりに新たなルールオブジェクトを追加する。更に、ルールオブジェクトのリストを使用するQueryInterfaceメソッドは、インターフェイス識別子当たりルールオブジェクトが1つしかないと(又は最初に見つかった1つが有効であると)仮定する。それ故、あるエラーチェック又は順序制御が好ましく実行される。他の囲まれたインターフェイスのリストと同様に、新たなルールオブジェクトは、リストのヘッド又はテイルのいずれかに挿入することができる。又、メソッドAddRule は、AddObject 及びAddInterfaceと同様に新たなルールオブジェクトをどこに追加するかを指示するパラメータを通すように変更することができる。或いは、他のリスト項目と同一にルールリスト項目を実施することができ、そしてメソッドAddInterfaceは、ルールオブジェクトをルールオブジェクトのリストに挿入するのに使用できる。多数の他の技術も考えられ、そして抽象的な意味では、ルールオブジェクトも動的に集合されたオブジェクトであることが当業者に明らかであろう。
【0121】
クラスMTOは、指定のインターフェイスをサーチしそして検索するメソッドEnumを与える。ルールを組み合わせるためのルールオブジェクトは、このメソッドを使用して、3つの集合されたインターフェイスリストからインターフェイスを検索することができる。更に、組み合わせルールを選択するためのルールオブジェクトは、このメソッドを用いて、ルールオブジェクトのリストからルールオブジェクトIRule インターフェイスを検索することができる。図示されたように、メソッドEnumは、指定のリストから要求されたインターフェイス識別子に一致するインターフェイスの第i番目の発生を返送する。このメソッドは、呼び出しにおいて指定されたリストのヘッド又はテイルからスタートする。別の実施例では、列挙されるリスト当たり1つづつの4つの個別のメソッドとして列挙子が実施される。
【0122】
通常、デフォールト及びオーバーライドリストに対し、メソッドEnumは、要求されたインターフェイス識別子を見つけるか又はリスト内の項目が尽きるまで、指定のリストから各リスト項目を検査する。この検査中に、リスト項目が全オブジェクトを指す場合には、メソッドEnumは、リスト項目によって指されたオブジェクトのメソッドQueryInterfaceを呼び出し、要求されたインターフェイスを潜在的に検索しそして返送する。さもなくば、リスト項目がIUnknown以外のインターフェイスを指す場合には、リスト項目により指されるインターフェイス識別子が、要求されたインターフェイス識別子と直接比較され、それらが一致する場合に、リスト項目により指されたインターフェイスが返送される。リスト項目が、一致するインターフェイスを発生しなかった場合には、このメソッドは、指定のリストの残り部分をサーチしつづける。
【0123】
メソッドEnumは、ルールオブジェクトのリストからサーチしそして検索するための若干異なる動作を与える。要求されたインターフェイス識別子を返送するのではなく、このメソッドは、インターフェイス識別子を使用して、ルールオブジェクトのリストにおける一致する項目を見つけ、そして要求されたインターフェイス識別子に対応するルールオブジェクトのIRule インターフェイスのポインタを返送する。
【0124】
コード表13において、囲んでいるMTOオブジェクトのメソッドQueryInterfaceは、ルールオブジェクトのリストをサポートするように変更されている。このメソッドは、先ず、入力パラメータで要求されたインターフェイスがMTOオブジェクト自体により実施されるかどうかを決定する。もしそうであれば、このメソッドは、このインターフェイスを返送する。さもなくば、このメソッドは、選択ルールがルールオブジェクトのリストに存在する場合にこれを検索して呼び出す。最後に、選択ルールが存在しない場合には、メソッドQueryInterfaceがデフォールト選択コードを与える。
【0125】
ルールオブジェクトは、IUnknownインターフェイス識別子のもとでルールオブジェクトにリストに追加される場合に選択ルールを与える。好ましくは、このインターフェイス識別子は、この目的のために指定される。1つの実施例においては、見つかった第1のこのようなルールオブジェクトが選択ルールとして検索される。もし存在する場合には、その検索された選択ルールは、組み合わせルールをサーチしそして検索する役目を果たし、或いは組み合わせルールが存在しない場合には、集合されたインターフェイスの3つのリストからインターフェイスをサーチしそして検索する。検索された選択ルールは、そのIUnknownインターフェイスに対してIUnknownインターフェイス識別子に対応するルールオブジェクトに問い合わせをし(IRule インターフェイスを用いて)そしてこの検索されたIUnknownインターフェイスのメソッドQueryInterfaceを呼び出すことにより、呼び出される。検索されたIUnknownインターフェイスは、ルールオブジェクトの制御IUnknownインターフェイスであることに注意されたい。
【0126】
選択ルールが存在しない場合には、メソッドMTO::QueryInterface は、デフォールト選択コードを与える。このデフォールト選択コードは、要求されたインターフェイスに対する組み合わせルールをそれが存在する場合に返送するか、又は通常リスト、オーバーライドリスト及びデフォールトリストから見つかった第1の一致するインターフェイスをその順序で返送する。(デフォールト選択コードは、組み合わせルールが存在しないときにメソッドMTO::QueryInterface と同様に動作する。)組み合わせルールを実施するルールオブジェクトは、要求されたインターフェイスの実行を与えるか、又は集合されたインターフェイスのMTOオブジェクトの3つのリストからインターフェイスを返送する。
【0127】
例えば、コード表13は、ルールオブジェクトのリストからルールオブジェクトを選択するための選択ルールを与えるルールオブジェクトの実施を示している。クラスMyQIは、IRule インターフェイス及びIUnknownインターフェイスを実施するルールオブジェクトである。理解を容易にするために、クラスMyQIは、非集合可能なオブジェクトとして示されている。IRule インターフェイスは、このルールオブジェクトを含む囲んでいるマルチタイプオブジェクト(MTO)のポインタを維持するためのメソッドInitを与える。このMTOポインタは、IMultitypeインターフェイスのメソッドEnumをアクセスするように後で使用され、集合されたインターフェイス及びオブジェクトをアクセスすることができる。メソッドInitは、ルールオブジェクトのリストにルールオブジェクトが追加されるときにAddRule によって呼び出される。IUnknownインターフェイスは、ルールオブジェクトのリストから組み合わせルールオブジェクトをいかに選択するかを知るQueryInterfaceの実施を与える。図示されたように、MyQI::QueryInterfaceは、MTO::QueryInterface により与えられるものと同一の機能を与える。しかしながら、その実施は、MyQI::QueryInterfaceがメソッドEnumを用いて組み合わせルールを見つけるのであって、リスト自体をサーチするのではない点で異なる。MTO::QueryInterface は同様に実施できることが当業者に明らかであろう。
【0128】
MyQIルールオブジェクトを用いる例がメソッドMTO::MTOにおいて示される。マルチタイプオブジェクトが具体化されるときには、構成子MTO::MTOが呼び出される。この構成子は、MyQIクラス定義を用いてIUnknownインターフェイスに対する新たなルールオブジェクトを形成し、次いで、このルールオブジェクトをメソッドAddRule を用いてルールオブジェクトのリストに追加する。選択ルールを実施するルールオブジェクトの追加はいつでも容易に実行できることが当業者に明らかであろう。
【0129】
コード表14は、マルチタイプオブジェクト及びルールオブジェクトを用いて1組の集合されたオブジェクト又はインターフェイスに対するオーバーライド動作を与えるC++擬似コードを示している。典型的に、異なるタイプの1組のオブジェクトが集合されたときには、各オブジェクトは、オブジェクトをいかにプリントするかを知るそれ自身のプリントメソッドを与える。コード表14は、IPrintインターフェイスの組み合わせルールを与えるルールオブジェクトの好ましいクラス定義のC++擬似コードを示す。与えられたIPrintインターフェイスはメソッドPrint を含み、これは、囲んでいるマルチタイプオブジェクトにおける各囲まれたオブジェクト又はインターフェイスのプリントメソッドを呼び出すものである。
【0130】
クラスMyPrintRule は、全てのルールオブジェクトと同様に、少なくとも2つのインターフェイス、この場合はIRule 及びIPrintに対する実行を与える。クラスMyPrintRule によって与えられるIRule インターフェイスは、コード表13を参照して既に述べたクラスMyQIと機能的に同一である。IPrintインターフェイスは、マルチタイプオブジェクトにおける集合されたオブジェクトの3つのリストを通して列挙する組み合わせルールを単に与えるもので、他のIPrintインターフェイスをサーチして、見つかった際にそれらのPrint ルールを呼び出す。コード表13について述べたように、このルールオブジェクトがマルチタイプオブジェクトにおけるルールオブジェクトのリストに追加された後に、マルチタイプオブジェクトの制御IUnknownのメソッドQueryInterfaceは、クライエントアプリケーションがその集合されたオブジェクトにおけるIID IPrintを要求するQueryInterfaceを呼び出すときに、この組み合わせルールIPrintインターフェイスのポインタを返送するのが好ましい。その結果、クライエントアプリケーションがメソッドPrint を呼び出すときには、このルールオブジェクトによって実行されるメソッドPrint が呼び出されて、その集合されたオブジェクトがその成分を正しくプリントするように確保する。
【0131】
コード表15は、コード表14で定められたルールオブジェクトをインストールするコールのC++擬似コードシーケンスを示す。先ず、クラスmyPrintRule ルールオブジェクトの新たなインスタンスが形成される。第2に、この新たなルールオブジェクトのIRule インターフェイスが後で使用するように検索される。第3に、マルチタイプオブジェクト(p MTO)のポインタをどこからか得た後に、マルチタイプオブジェクトのIMultitypeインターフェイスが検索される。最終的に、この検索されたIMultitypeインターフェイスのメソッドAddRule が呼び出され、これに、新たなルールオブジェクト(IID IPrint) に対するインターフェイス識別子及び新たなルールオブジェクトのIRule インターフェイスを通す。
【0132】
好ましい実施例では、集合されたオブジェクトは、プリントについて説明した同じメカニズムを用いて永続的に記憶される。特に、マルチタイプオブジェクトは、IPersistFileインターフェイス又は他のインターフェイスに対する組み合わせオブジェクトを与え、これは、オブジェクトをセーブしそして検索する役割を果たす。(IPersistFileインターフェイスは、オブジェクトをセーブしそしてロードするメソッドである。)このように、マルチタイプオブジェクトは、囲まれたオブジェクト及びインターフェイスのセーブ機能にオーバーライドして、集合された全てのオブジェクトがセーブされるように確保する。組み合わせルールはマルチタイプオブジェクトが最初に必要とするデータ構造をセーブし、そして囲まれたIPersistFileインターフェイス又はオブジェクトの各々においてメソッドSaveを呼び出す。従って、集合オブジェクトをセーブすることに関与するために、クライエントプログラムは、囲まれるべきオブジェクトのIPersistFileインターフェイスを追加するか、又は全オブジェクトを囲い込む。個別のファイルに個別の記憶が必要とされるのではない。マルチタイプオブジェクトは、オブジェクトデータを単一のファイル内に記憶したのと同様の仕方でそれ自身のデータを記憶することができる。
【0133】
集合されたインターフェイス又はオブジェクトとルールの1つのリストのみを実施する(3つのリストとルールオブジェクトのリストではなくて)別の実施例では、マルチタイプオブジェクトはそれ自身の記憶を必要としない。集合されたオブジェクトにより使用されるもの以外の記憶は必要でない。というのは、マルチタイプオブジェクトは、ハイアラーキ式の永続記憶構造において集合されたオブジェクトの順序及びインデックス情報を検査することにより単一リストを再形成できるからである。しかしながら、多数のインターフェイスリストを実行するマルチタイプオブジェクトは、どのインターフェイスインスタンスがどのリストによって指されるかを区別するために情報を記憶することを一般に必要とする。
【0134】
本発明のここに示す実施例は、制御IUnknown::QueryInterfaceメソッドが囲まれたオブジェクトのQueryInterfaceメソッドを呼び出すときに、このような呼び出しが同期しておこなわれると仮定する。即ち、囲まれたオブジェクトQueryInterfaceメソッドは、制御IUnknown::QueryInterfaceメソッドが次の囲まれたオブジェクトQueryInterfaceメソッドを呼び出す前に復帰する。別の実施例では、制御IUnknown::QueryInterfaceメソッドは、囲まれたオブジェクトQueryInterfaceメソッドを、それらの復帰を待機せずに非同期で呼び出す。むしろ、標準的なプロセス間通信メカニズムを用いて、囲まれたオブジェクトメソッドが完了したときに制御ルーチンを知らせる。このような実施例は、ネットワーク又はマルチプロセッサ環境において有用である。
【0135】
動的な集合に対する本発明の典型的なアプリケーションは、動的な集合の知識で開発されたプログラムを用いてユーザがオブジェクトのインスタンスを更に強力なオブジェクトへと組み合わせることである。例えば、背景技術で説明したスプレッドシートインターフェイスの例を用いて、ソフトウェアの販売者がスプレッドシート製品を出荷し、そこからユーザがスプレッドシートの基本的な操作に対しIBasicインターフェイスのみをサポートする集合可能なスプレッドシートオブジェクトを形成できると仮定する。(即ち、この製品を用いて、ユーザは、スプレッドシートオブジェクトであるIBasicインターフェイスのインスタンスを形成することができる。)更に、別のソフトウェア販売者がデータベース製品を出荷し、そこからユーザが集合可能なデータベース問合せオブジェクトを形成できると仮定する。これらの集合可能なデータベース問合せオブジェクトは、IDatabaseQueryインターフェイスをサポートし、これは、例えば、問合せを実行するメソッドDoQuery と、ユーザが問合せを指定できるようにするメソッドDefineQuery とを備えている。入力データとして働くことのできる他のオブジェクトに取り付けられたときに、これらのデータベース問合せオブジェクトは、その取り付けられた入力データに問い合わせをするように呼び出すことができる。又、コンピュータシステム上にプログラムが常駐し、例えば、オブジェクトをマネージしそしてマルチタイプオブジェクトをいかに形成し他のオブジェクト及びインターフェイスを一緒に集合するかを知るファイルマネージャが常駐すると仮定する。このタスクを行うために、ファイルマネージャは、IMultitypeインターフェイスの実行を与えるマルチタイプオブジェクトをいかに形成するかを知る。
【0136】
図15は、取り付けられたデータベース問合せオブジェクトを形成するように一緒に集合することのできるスプレッドシートオブジェクト及びデータベース問合せオブジェクトを示す図である。指定されたデータベースにおいて指定された問合せを実行することのできる更に強力なオブジェクト(取り付けられたデータベース問合せオブジェクト1205)を形成するために、ユーザは、先ず、スプレッドシート製品を用いて、ユーザが入力データとして使用しようとするスプレッドシートオブジェクト1201のインスタンスを形成する。次いで、ユーザは、データベース製品を用いて、データベース問合せオブジェクト1202のインスタンスを形成する。次いで、ユーザは、定義ボタン1204を押すことによりIDatabaseQueryインターフェイスのメソッドDefineQuery を呼び出し、そしてデータベース言語、例えば、SQL言語を用いてデータベース問合せに対するテキストを入力する。次いで、ユーザは、ファイルマネージャ1208を呼び出す。このファイルマネージャを用いて、ユーザは、スプレッドシートオブジェクト1201及びデータベース問合せオブジェクト1202を選択し、ファイルマネージャ1208がそれらを集合することを要求する。ユーザは、例えば、スプレッドシートオブジェクト1201のディスプレイ表示をデータベース問合せオブジェクト1202のディスプレイ表示のデータ入力ポート1203にドラグ及びドロップすることにより、この要求を指示することができる。ユーザの要求に応答して、ファイルマネージャ1208は、囲んでいるマルチタイプオブジェクトを具体化しそしてスプレッドシートオブジェクト1201及びデータベース問合せオブジェクト1202の両方に対してメソッドIMultitype::AddObject を呼び出すことにより、新たに取り付けられたデータベース問合せオブジェクト1205を具体化する。又、ファイルマネージャ1208は、スプレッドシートオブジェクト1201及びデータベース問合せオブジェクト1202の両方に、この新たに具体化されたマルチタイプオブジェクトの制御IUnknownインターフェイスのポインタを通す。次いで、ユーザは、"Go"ボタン1206を選択することによりその取り付けられたデータベース問合せオブジェクトを呼び出して、その取り付けられたスプレッドシートデータにおいて指定の問合せを実行することができる。
【0137】
オブジェクトがいったん集合されると、囲んでいるオブジェクトのルールがそれに適用されることが当業者に明らかであろう。従って、スプレッドシートオブジェクト1201及びデータベース問合せオブジェクトの動作は、いったん囲まれると、変更し得る。
【0138】
図16は、集合された取り付けられたデータベース問合せオブジェクトを示すブロック図である。集合されたオブジェクト1304は、図15を参照して述べた取り付けられたデータベース問合せオブジェクトに対応する。集合されたオブジェクト1304は、マルチタイプオブジェクト1301と、スプレッドシートオブジェクト1302と、データベース問合せオブジェクト1303とを備えている。マルチタイプオブジェクト1301は、上記のように、ユーザ要求に応答して、スプレッドシートオブジェクト1302及びデータベース問合せオブジェクト1303を集合するように形成される。集合のプロセス中に、マルチタイプオブジェクトは、集合されたオブジェクトに対するポインタ1305及び1306を形成し、そして集合されるべきオブジェクトに、制御IUnknownインターフェイスに対するポインタを通す。その後に、ユーザが"Go"ボタン(図15の1206)を押したときに、マルチタイプオブジェクト1307の制御IUnknownインターフェイスが呼び出され、上記実施例を用いてデータベース問合せオブジェクト1303のIDatabaseQueryインターフェイスのメソッドDoQuery を呼び出す。メソッドDoQuery は、次いで、メソッドQueryInterfaceを用いてスプレッドシートオブジェクト1302の(既知の)所望のインターフェイス識別子をサーチすることによりスプレッドシートオブジェクト1302の(既知の)所望のメソッドに問合せしそして呼び出す。(再呼び出しのために、メソッドQueryInterfaceの呼び出しは、制御IUnknown1307のメソッドQueryInterfaceにマルチタイプオブジェクト1301を送り、これは、もし存在すれば所望のインターフェイスを位置決めする。)従って、データベース問合せオブジェクト1303は、メソッド及びインターフェイス識別子の名前(及びパラメータ)が分かる限り、スプレッドシートオブジェクト1302のインターフェイスのコンパイル時間定義をアクセスする必要なく、スプレッドシートオブジェクト1302のメソッドを呼び出すことができる。
【0139】
以上、好ましい実施例について本発明を説明したが、本発明は、これらの実施例に限定されるものではない。当業者であれば、本発明の範囲内で変更がなされ得ることが明らかであろう本発明の範囲は、特許請求の範囲のみによって限定されるものとする。
【図面の簡単な説明】
【図1】オブジェクトを表現するのに使用される典型的なデータ構造を示すブロック図である。
【図2】ネストクラスを用いるスプレッドシートオブジェクトのサンプルデータ構造を示すブロック図である。
【図3】集合オブジェクトを示すブロック図である。
【図4】クラスS1のオブジェクトのインスタンスのデータ構造レイアウトを示すブロック図である。
【図5】クラスS3のオブジェクトのデータ構造レイアウトを示すブロック図である。
【図6】囲んでいるオブジェクトと囲まれたオブジェクトとの間の協働を示すブロック図である。
【図7】囲んでいるオブジェクトと囲まれたオブジェクトとの間の協働を示すブロック図である。
【図8】2つのオブジェクトをマルチタイプオブジェクトに加えるシーケンスを示すブロック図である。
【図9】2つのオブジェクトをマルチタイプオブジェクトに加えるシーケンスを示すブロック図である。
【図10】2つのオブジェクトをマルチタイプオブジェクトに加えるシーケンスを示すブロック図である。
【図11】クラスS1のオブジェクトのインスタンスのデータ構造レイアウトを示すブロック図である。
【図12】マルチタイプオブジェクトによって実施されるIMultitypeインターフェイスのメソッドAddInterfaceを示すフローチャートである。
【図13】マルチタイプオブジェクトに対する制御IUnknownインターフェイスのメソッドQueryInterfaceを示すフローチャートである。
【図14】メソッドAddObject を用いてIBasic、IPrint及びIDatabase インターフェイスが動的に集合された後の図10に対応するマルチタイプオブジェクトのデータ構造レイアウトを示すブロック図である。
【図15】取り付けられたデータベース問合せオブジェクトを形成するように一緒に集合することのできるスプレッドシートオブジェクト及びデータベース問合せオブジェクトを示す図である。
【図16】集合され取り付けられたデータベース問合せオブジェクトを示すブロック図である。
【符号の説明】
301 囲んでいるオブジェクト
302、303 囲まれたオブジェクト
304 実現部
401 インスタンス構造体
402、403 仮想関数表
404−416 関数
501 インスタンスデータ
502、503、504 仮想関数表
505−517 メソッド
601 クラスS1オブジェクト
603、604、605、606 メソッド
Claims (16)
- CPUが、メモリに事前に格納されたプログラムの命令に基づいて、囲んでいるオブジェクトにインターフェイスを追加するための、CPU及びメモリを有するコンピュータシステムにおいて実行される方法であって、オブジェクトにより実現されるインターフェイスが、囲んでいるオブジェクト内に囲まれ得るようにし、当該囲まれ得るオブジェクトが、上記インターフェイスに対する参照を検索するための問い合わせ関数メンバを有し、当該囲んでいるオブジェクトが、当該囲んでいるオブジェクトにインターフェイスを追加するためのインターフェイス追加関数メンバ、及び、追加されたインターフェイスに対する参照を検索するための問い合わせ関数メンバを有し、当該囲まれ得るオブジェクトがクラスによって規定され、当該囲んでいるオブジェクトがクラスによって規定されるものであり、以下の各段階、即ち、
CPUが、メモリ内に事前に記憶されたプログラム命令に基づいて、上記囲んでいるオブジェクトを規定するクラスのインスタンスを形成することによって、メモリ内に、上記囲んでいるオブジェクトを形成し、
CPUが、メモリ内に事前に記憶されたプログラム命令に基づいて、囲まれ得るオブジェクトを規定するクラスのインスタンスを形成することによって、上記囲んでいるオブジェクト内に囲まれ得るオブジェクトをメモリ内に形成し、CPUが、上記囲んでいるオブジェクトのオブジェクト管理インタフェースに対する参照を囲まれ得るオブジェクトに渡し、そして
CPUが、上記囲んでいるオブジェクトのインターフェイス追加関数メンバを呼び出し、囲まれ得るオブジェクトのインタフェースに対する参照を上記インターフェイス追加関数メンバに渡してオブジェクトを囲むと、その囲まれたオブジェクトのインターフェイスが上記囲んでいるオブジェクトに追加され、これにより集合オブジェクトを形成し、上記囲んでいるオブジェクトの問合せ関数メンバが上記集合オブジェクト以外の他のオブジェクトによって呼び出されたときに、上記囲んでいるオブジェクトの問合せ関数メンバは、上記囲んでいるオブジェクトに追加されたインターフェイスに対する参照を上記他のオブジェクトに返送する、
という段階を備えたことを特徴とする方法。 - CPUは、上記囲んでいるオブジェクトの問合せ関数メンバが呼び出された後、上記囲んでいるオブジェクトに追加されたインターフェイスに対する参照を上記他のオブジェクトに返送するにあたり、当該問い合わせ関数メンバからの応答を待たないことにより、上記囲んでいるオブジェクトの問合せ関数メンバの呼び出しを、非同期で行う請求項1に記載の方法。
- CPUは、上記囲んでいるオブジェクトの問合せ関数メンバが呼び出された後、上記囲んでいるオブジェクトに追加されたインターフェイスに対する参照を上記他のオブジェクトに返送するにあたり、当該問い合わせ関数メンバからの応答を待つことにより、上記囲んでいるオブジェクトの問合せ関数メンバの呼び出しを同期して行う請求項1に記載の方法。
- 上記囲んでいるオブジェクトは、デフォールト動作を実現するインターフェイスを与える請求項1に記載の方法。
- 上記囲んでいるオブジェクトは、囲まれたオブジェクトの追加されたインターフェイスをオーバーライドするインターフェイスを与える請求項1に記載の方法。
- 上記囲んでいるオブジェクトは、囲まれたオブジェクトによって提示されるインターフェイスについての知識をもたない請求項1に記載の方法。
- 上記コンピュータシステムは、永続記憶のための装置を有し、そして更に、
囲まれ得るオブジェクトのインタフェースに対する参照を、囲んでいるオブジェクトに渡した後に、それによって集合オブジェクトを形成し、また、CPUによりその集合オブジェクトを上記永続記憶装置に記憶し、
CPUは、上記集合オブジェクトを記憶した後に、その記憶された集合オブジェクトを上記永続記憶装置からその後にロードするという段階を備えた請求項1に記載の方法。 - CPUは、上記囲んでいるオブジェクトのインターフェイス追加関数メンバを呼び出した後、メモリ内に記憶されたプログラム命令に基づいて、上記囲んでいるオブジェクトの中に囲まれ得る第2のオブジェクトをメモリ内に形成し、これにより、CPUは上記囲んでいるオブジェクトのオブジェクト管理インタフェースに対する参照を上記第2のオブジェクトに渡し、第2のオブジェクトは提示されたインターフェイスを有し、そして、
CPUは、上記囲んでいるオブジェクトのインターフェイス追加関数メンバを2回目に呼び出すと、上記第2オブジェクトの提示されたインターフェイスを上記囲んでいるオブジェクトに追加することにより上記第2オブジェクトを囲むと、これにより、CPUは、囲まれた第1オブジェクトの問合せ関数メンバが上記集合オブジェクト以外の他のオブジェクトによって呼び出されたときに、上記囲まれた第1オブジェクトの問合せ関数メンバが上記囲まれた第2オブジェクトの追加され提示されたインターフェイスに対する参照を上記他のオブジェクトに返送する、
という段階を更に備えた請求項1に記載の方法。 - 上記囲まれた第2オブジェクトの提示されたインターフェイスは、上記囲まれた第1オブジェクトのインターフェイスをオーバーライドする請求項8に記載の方法。
- CPUが、上記囲まれた第2オブジェクトの提示されたインターフェイスを用いて、上記囲まれた第1オブジェクトのインターフェイスを呼び出す請求項8に記載の方法。
- 上記囲まれた第2オブジェクトの提示されたインターフェイスは、デフォールト動作を実現するインターフェイスである請求項8に記載の方法。
- 上記囲まれた第1オブジェクトは、上記囲んでいるオブジェクトのインタフェースに対する参照を含み、上記第2オブジェクトは、第2オブジェクトの提示されたインターフェイスに対する参照を検索するための問合せ関数メンバを有し、そして更に、CPUが、囲んでいるオブジェクトのインタフェース追加関数メンバを2回目に呼び出した後に、CPUは、以下の段階、即ち、
第1に、2回目に、囲んでいるオブジェクトのインターフェイス追加関数メンバを呼び出した後に、上記囲まれた第1オブジェクトの問合せ関数メンバを呼び出すことによって第2オブジェクトの提示されたインターフェイスを要求し、
第2に、上記囲まれた第1オブジェクトに含まれている上記囲んでいるオブジェクトのインタフェースに対する参照を介して、上記囲んでいるオブジェクトの問合せ関数メンバに対する参照を検索し、
第3に、上記囲んでいるオブジェクトの問合せ関数メンバを呼び出し中に、上記要求されたインターフェイスを囲んでいるオブジェクトの問合せ関数メンバに渡し、
第4に、上記囲んでいるオブジェクトの問合せ関数メンバから、上記囲まれた第2オブジェクトの問合せ関数メンバを呼び出し中に、上記要求されたインターフェイスを上記囲まれた第2のオブジェクトの問合せ関数メンバに渡し、そして
第5に、上記要求されたインターフェイスに対する参照を、上記囲まれた第2オブジェクトの問合せ関数メンバから上記囲んでいるオブジェクトの問合わせ関数メンバに返送する、
という段階を更に備えた請求項8に記載の方法。 - 上記囲んでいるオブジェクトは、どの追加インターフェイスに対する参照を検索するかを決定するためのルールを追加するルール追加関数メンバを有し、そして更に、囲んでいるオブジェクトに、囲まれ得るオブジェクトに対する参照を渡した後に、それによって集合オブジェクトを形成し、さらにどの追加インターフェイスに対する参照を検索するかを決定するルールを追加するために、CPUは上記囲んでいるオブジェクトのルール追加関数メンバを呼び出し、これにより、CPUは、上記囲んでいるオブジェクトの問合せ関数メンバを呼び出したとき、その問合せ関数メンバを実行することに基づいて、その追加されたルールからどの追加インターフェイスに参照を返送するかを決定するという段階を更に備えた請求項8に記載の方法。
- 上記コンピュータシステムにおいて実行される方法を実現するための各処理は、特定のオブジェクト指向言語に限定されずに実行できる、請求項8に記載の方法。
- CPUは、囲んでいるオブジェクトのルール追加関数メンバを呼び出した後に、要求されたインターフェイスに対する参照を検索するために上記囲んでいるオブジェクトの問合せ関数メンバを呼び出し、これにより、上記囲んでいるオブジェクトの問合せ関数メンバの実行に基づいて、追加されたルールを用いて、どのインターフェイスに参照を返送するかを決定するという段階を更に備えた請求項13に記載の方法。
- オブジェクトにインターフェイスを追加するためのコンピュータシステムにおいて、
CPUと、
CPUのためのメモリと、
CPUにより、囲んでいるオブジェクトへのインターフェイスを追加するためのインターフェイス追加関数メンバ、及び、インターフェイスに対する参照を検索するための問合せ関数メンバを有する、メモリ内の囲んでいるオブジェクトと、
上記囲んでいるオブジェクト内に囲まれ得るオブジェクトとを備え、
上記囲まれ得るオブジェクトは、インターフェイスと、該インターフェイスに対する参照を上記CPUにより検索するための問合せ関数メンバとを有し、
CPUが、上記囲んでいるオブジェクトのインターフェイス追加関数メンバを呼び出し、囲まれ得るオブジェクトのインターフェースに対する参照を上記インターフェイス追加関数メンバに渡してオブジェクトを囲むと、その囲まれたオブジェクトのインターフェイスが上記囲んでいるオブジェクトに追加され、これにより集合オブジェクトを形成すると、上記囲んでいるオブジェクトの問合せ関数メンバが上記集合オブジェクト以外の他のオブジェクトによって呼び出されたときに、上記囲んでいるオブジェクトの問合せ関数メンバは、上記囲んでいるオブジェクトに追加されたインターフェイスに対する参照を上記他のオブジェクトに返送することを特徴とするコンピュータシステム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/185,465 US5805885A (en) | 1992-12-24 | 1994-01-24 | Method and system for aggregating objects |
US08/185465 | 1994-01-24 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH0836493A JPH0836493A (ja) | 1996-02-06 |
JP4322967B2 true JP4322967B2 (ja) | 2009-09-02 |
Family
ID=22681086
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP00830895A Expired - Lifetime JP4322967B2 (ja) | 1994-01-24 | 1995-01-23 | オブジェクト集合方法及びシステム |
Country Status (5)
Country | Link |
---|---|
US (7) | US5805885A (ja) |
EP (4) | EP0664510B1 (ja) |
JP (1) | JP4322967B2 (ja) |
CA (1) | CA2140166C (ja) |
DE (1) | DE69533530T2 (ja) |
Families Citing this family (112)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0930566A3 (en) * | 1992-07-06 | 2006-07-05 | Microsoft Corporation | Method and system for composing objects |
US5805885A (en) | 1992-12-24 | 1998-09-08 | Microsoft Corporation | Method and system for aggregating objects |
US5838906A (en) | 1994-10-17 | 1998-11-17 | The Regents Of The University Of California | Distributed hypermedia method for automatically invoking external application providing interaction and display of embedded objects within a hypermedia document |
JPH09134282A (ja) * | 1995-11-08 | 1997-05-20 | Hitachi Ltd | プログラム作成方法 |
US6199095B1 (en) * | 1996-01-29 | 2001-03-06 | Compaq Computer Corporation | System and method for achieving object method transparency in a multi-code execution environment |
GB9604522D0 (en) * | 1996-03-02 | 1996-05-01 | Univ Strathclyde | Databases |
US6026416A (en) * | 1996-05-30 | 2000-02-15 | Microsoft Corp. | System and method for storing, viewing, editing, and processing ordered sections having different file formats |
US6268924B1 (en) * | 1996-06-06 | 2001-07-31 | Microsoft Corporation | Document object having a print interface for programmatic automation by a using program |
US6088739A (en) * | 1996-06-28 | 2000-07-11 | Microsoft Corporation | Method and system for dynamic object clustering |
US5893107A (en) * | 1996-07-01 | 1999-04-06 | Microsoft Corporation | Method and system for uniformly accessing multiple directory services |
US5878432A (en) * | 1996-10-29 | 1999-03-02 | International Business Machines Corporation | Object oriented framework mechanism for a source code repository |
EP0841612A3 (en) * | 1996-11-08 | 2003-05-28 | International Business Machines Corporation | Framework for software development |
US6418482B1 (en) * | 1996-11-12 | 2002-07-09 | International Business Machines Corporation | Reference attributes within an object-oriented system |
US5991802A (en) * | 1996-11-27 | 1999-11-23 | Microsoft Corporation | Method and system for invoking methods of objects over the internet |
US5896544A (en) | 1996-12-26 | 1999-04-20 | Intel Corporation | Software device for supporting a new class of PC peripherals |
US6038593A (en) * | 1996-12-30 | 2000-03-14 | Intel Corporation | Remote application control for low bandwidth application sharing |
US6304918B1 (en) * | 1997-03-11 | 2001-10-16 | Microsoft Corporation | Object interface control system |
US6275866B1 (en) * | 1997-03-14 | 2001-08-14 | Mathsoft Engineering & Education, Inc. | Manipulation and coupling of object oriented components |
US6035342A (en) | 1997-03-19 | 2000-03-07 | Microsoft Corporation | Method and computer program product for implementing object relationships |
US6282581B1 (en) * | 1997-03-27 | 2001-08-28 | Hewlett-Packard Company | Mechanism for resource allocation and for dispatching incoming calls in a distributed object environment |
US6708222B1 (en) * | 1997-05-01 | 2004-03-16 | Microsoft Corporation | Method and system for locating enclosing owners of embedded objects |
JP3788543B2 (ja) * | 1997-05-20 | 2006-06-21 | 富士通株式会社 | 会議支援システム及び記録媒体 |
US6209125B1 (en) * | 1997-06-03 | 2001-03-27 | Sun Microsystems, Inc. | Method and apparatus for software component analysis |
US6718534B1 (en) | 1997-07-14 | 2004-04-06 | Microsoft Corporation | System for application independent programming of controls |
US6108661A (en) * | 1997-07-14 | 2000-08-22 | Microsoft Corporation | System for instance customization |
US6449659B1 (en) * | 1997-07-14 | 2002-09-10 | Microsoft Corporation | System for instance customization with application independent programming of controls |
US6304894B1 (en) | 1997-09-22 | 2001-10-16 | Hitachi, Ltd. | Proxy server and recording medium storing a proxy server program |
US6678744B2 (en) * | 1997-10-09 | 2004-01-13 | Ericsson Inc. | Application wrapper methods and systems |
ATE265062T1 (de) * | 1997-10-27 | 2004-05-15 | Sony Service Ct Europe Nv | System von programmobjekten und programmkomponenten mit externer schnittstelle |
US6862736B2 (en) | 1998-02-06 | 2005-03-01 | Microsoft Corporation | Object manager for common information model |
US6182277B1 (en) * | 1998-04-15 | 2001-01-30 | Oracle Corporation | Methods and apparatus for declarative programming techniques in an object oriented environment |
US6473100B1 (en) * | 1998-05-20 | 2002-10-29 | Microsoft Corporation | Hosting controls in a window via an interface for controlling the window |
US6256780B1 (en) * | 1998-09-10 | 2001-07-03 | Microsoft Corp. | Method and system for assembling software components |
US7039919B1 (en) * | 1998-10-02 | 2006-05-02 | Microsoft Corporation | Tools and techniques for instrumenting interfaces of units of a software program |
US6988271B2 (en) * | 1998-10-02 | 2006-01-17 | Microsoft Corporation | Heavyweight and lightweight instrumentation |
US6694378B1 (en) * | 1998-12-22 | 2004-02-17 | Intel Corporation | Extension of device driver objects |
US6510551B1 (en) | 1998-12-22 | 2003-01-21 | Channelpoint, Inc. | System for expressing complex data relationships using simple language constructs |
US6802065B1 (en) * | 1998-12-29 | 2004-10-05 | Honeywell Inc. | System and methods for permitting access to a singular network process by multiple user processes |
US6356214B1 (en) | 1999-02-02 | 2002-03-12 | Cisco Technology, Inc. | Fast look-up table based scheme for NRZI encoding/decoding and zero insertion/removal in serial bit streams |
US6804714B1 (en) * | 1999-04-16 | 2004-10-12 | Oracle International Corporation | Multidimensional repositories for problem discovery and capacity planning of database applications |
US6606613B1 (en) | 1999-06-03 | 2003-08-12 | Microsoft Corporation | Methods and apparatus for using task models to help computer users complete tasks |
US6330554B1 (en) | 1999-06-03 | 2001-12-11 | Microsoft Corporation | Methods and apparatus using task models for targeting marketing information to computer users based on a task being performed |
US6539374B2 (en) * | 1999-06-03 | 2003-03-25 | Microsoft Corporation | Methods, apparatus and data structures for providing a uniform representation of various types of information |
US6778971B1 (en) | 1999-06-03 | 2004-08-17 | Microsoft Corporation | Methods and apparatus for analyzing computer-based tasks to build task models |
US6877163B1 (en) * | 1999-06-14 | 2005-04-05 | Sun Microsystems, Inc. | Method and system for dynamic proxy classes |
US6826760B1 (en) * | 1999-06-16 | 2004-11-30 | Microsoft Corporation | Methods of factoring operating system functions, methods of converting operating systems, and related apparatus |
GB2351370A (en) * | 1999-06-25 | 2000-12-27 | Ibm | Data processing with policed object union |
US6405310B1 (en) * | 1999-07-09 | 2002-06-11 | Hewlett-Packard Company | System and method for peripheral system management using operation object interfaces for device control |
US6408292B1 (en) * | 1999-08-04 | 2002-06-18 | Hyperroll, Israel, Ltd. | Method of and system for managing multi-dimensional databases using modular-arithmetic based address data mapping processes on integer-encoded business dimensions |
US6385604B1 (en) * | 1999-08-04 | 2002-05-07 | Hyperroll, Israel Limited | Relational database management system having integrated non-relational multi-dimensional data store of aggregated data elements |
US7058956B1 (en) * | 1999-09-01 | 2006-06-06 | Microsoft Corporation | Directory services interface extensions with aggregatable software objects |
US7539849B1 (en) * | 2000-01-20 | 2009-05-26 | Sun Microsystems, Inc. | Maintaining a double-ended queue in a contiguous array with concurrent non-blocking insert and remove operations using a double compare-and-swap primitive |
GB0004090D0 (en) * | 2000-02-22 | 2000-04-12 | Innovation Venture Ltd | Application programming system and method of operation thereof |
US20020029207A1 (en) * | 2000-02-28 | 2002-03-07 | Hyperroll, Inc. | Data aggregation server for managing a multi-dimensional database and database management system having data aggregation server integrated therein |
US7089242B1 (en) * | 2000-02-29 | 2006-08-08 | International Business Machines Corporation | Method, system, program, and data structure for controlling access to sensitive functions |
US7269786B1 (en) * | 2000-05-04 | 2007-09-11 | International Business Machines Corporation | Navigating an index to access a subject multi-dimensional database |
US6915289B1 (en) | 2000-05-04 | 2005-07-05 | International Business Machines Corporation | Using an index to access a subject multi-dimensional database |
US7051080B1 (en) * | 2000-08-04 | 2006-05-23 | Oracle International Corporation | Techniques for navigating in mobile applications |
US6895437B1 (en) * | 2000-09-07 | 2005-05-17 | Usability Sciences Corporation | System for monitoring browsing activity of a visitor and decrementing a reference count upon a web page change for automatic unloading a client program |
GB2371378A (en) | 2000-10-12 | 2002-07-24 | Abb Ab | Object oriented control system |
US7152223B1 (en) * | 2001-06-04 | 2006-12-19 | Microsoft Corporation | Methods and systems for compiling and interpreting one or more associations between declarations and implementations in a language neutral fashion |
US20030014555A1 (en) * | 2001-06-29 | 2003-01-16 | Michal Cierniak | System and method for efficient dispatch of interface calls |
FR2827406A1 (fr) * | 2001-07-10 | 2003-01-17 | Koninkl Philips Electronics Nv | Methode generique de parcours d'un arbre objets pour invoquer une methode specifique sur certains objets dudit arbre |
US7010779B2 (en) * | 2001-08-16 | 2006-03-07 | Knowledge Dynamics, Inc. | Parser, code generator, and data calculation and transformation engine for spreadsheet calculations |
US7010791B2 (en) * | 2001-09-20 | 2006-03-07 | Intel Corporation | Method for implementing multiple type hierarchies |
US20030145281A1 (en) * | 2001-10-31 | 2003-07-31 | Metacyber.Net | Hypertext page generator for a computer memory resident rapid comprehension document for original source information, and method |
DE10157633A1 (de) * | 2001-11-26 | 2003-08-28 | Siemens Ag | Medizinische Systemarchitektur mit einer komponentenorientierten Architektur zur Befundung und Dokumentation |
US7051336B1 (en) * | 2002-02-28 | 2006-05-23 | Advanced Micro Devices | Use of inheritance to allow concurrent programming |
US7181460B2 (en) * | 2002-06-18 | 2007-02-20 | International Business Machines Corporation | User-defined aggregate functions in database systems without native support |
US7065745B2 (en) * | 2002-12-16 | 2006-06-20 | Sun Microsystems, Inc. | System and method for evaluating and executing hierarchies of rules |
US7472127B2 (en) * | 2002-12-18 | 2008-12-30 | International Business Machines Corporation | Methods to identify related data in a multidimensional database |
US8516504B1 (en) * | 2003-01-28 | 2013-08-20 | Altera Corporation | Method for adding device information by extending an application programming interface |
US7500248B2 (en) * | 2003-04-29 | 2009-03-03 | Microsoft Corporation | Systems and methods for implementing aggregation containers |
US7685581B2 (en) * | 2003-06-27 | 2010-03-23 | Microsoft Corporation | Type system for representing and checking consistency of heterogeneous program components during the process of compilation |
US7086041B2 (en) * | 2003-06-27 | 2006-08-01 | Microsoft Corporation | Extensible type system for representing and checking consistency of program components during the process of compilation |
US7559050B2 (en) * | 2003-06-30 | 2009-07-07 | Microsoft Corporation | Generating software development tools via target architecture specification |
US7707566B2 (en) * | 2003-06-26 | 2010-04-27 | Microsoft Corporation | Software development infrastructure |
US7788652B2 (en) * | 2003-06-27 | 2010-08-31 | Microsoft Corporation | Representing type information in a compiler and programming tools framework |
US20050039171A1 (en) * | 2003-08-12 | 2005-02-17 | Avakian Arra E. | Using interceptors and out-of-band data to monitor the performance of Java 2 enterprise edition (J2EE) applications |
US7437734B2 (en) * | 2003-08-12 | 2008-10-14 | Hewlett-Packard Development Company, L.P. | Propagating web transaction context into common object model (COM) business logic components |
US7493622B2 (en) * | 2003-08-12 | 2009-02-17 | Hewlett-Packard Development Company, L.P. | Use of thread-local storage to propagate application context in Java 2 enterprise edition (J2EE) applications |
US7484209B2 (en) | 2003-08-12 | 2009-01-27 | Hewlett-Packard Development Company, L.P. | Instrumenting java code by modifying bytecodes |
US7496903B2 (en) | 2003-08-12 | 2009-02-24 | Hewlett-Packard Development Company, L.P. | Synthesizing application response measurement (ARM) instrumentation |
US8238696B2 (en) | 2003-08-21 | 2012-08-07 | Microsoft Corporation | Systems and methods for the implementation of a digital images schema for organizing units of information manageable by a hardware/software interface system |
US8166101B2 (en) * | 2003-08-21 | 2012-04-24 | Microsoft Corporation | Systems and methods for the implementation of a synchronization schemas for units of information manageable by a hardware/software interface system |
US7730073B2 (en) * | 2003-10-23 | 2010-06-01 | Microsoft Corporation | System and a method for presenting related items to a user |
US7908562B2 (en) * | 2003-10-23 | 2011-03-15 | Microsoft Corporation | System and a method for presenting items to a user with a contextual presentation |
US20050091181A1 (en) * | 2003-10-23 | 2005-04-28 | Mckee Timothy P. | System and method for the presentation of items stored on a computer |
US7685563B2 (en) * | 2004-03-01 | 2010-03-23 | Microsoft Corporation | Reusable customized project system |
US7805523B2 (en) * | 2004-03-15 | 2010-09-28 | Mitchell David C | Method and apparatus for partial updating of client interfaces |
US20050229186A1 (en) * | 2004-03-15 | 2005-10-13 | Canyonbridge, Inc. | Method and apparatus for dynamic runtime object aggregation |
US8572221B2 (en) | 2004-05-26 | 2013-10-29 | Facebook, Inc. | System and method for managing an online social network |
US20050289559A1 (en) * | 2004-06-08 | 2005-12-29 | Daniel Illowsky | Method and system for vertical layering between levels in a processing unit facilitating direct event-structures and event-queues level-to-level communication without translation |
US8578399B2 (en) * | 2004-07-30 | 2013-11-05 | Microsoft Corporation | Method, system, and apparatus for providing access to workbook models through remote function cells |
US10216372B1 (en) * | 2004-12-06 | 2019-02-26 | The Mathworks, Inc. | Automatic import to a graphical model |
US7636888B2 (en) * | 2005-03-15 | 2009-12-22 | Microsoft Corporation | Verifying compatibility between document features and server capabilities |
EP1746499A1 (de) | 2005-07-05 | 2007-01-24 | Siemens Aktiengesellschaft | System und Verfahren zur Entwicklung einer Software oder einer Softwarekomponente sowie Verfahren zum Betrieb einer solchen Software |
US20070083378A1 (en) * | 2005-10-11 | 2007-04-12 | Microsoft Corporation | Secure application programming interface |
US20070208582A1 (en) * | 2006-03-02 | 2007-09-06 | International Business Machines Corporation | Method, system, and program product for providing an aggregated view |
US7865583B2 (en) | 2006-03-31 | 2011-01-04 | The Invention Science Fund I, Llc | Aggregating network activity using software provenance data |
US7805730B2 (en) * | 2006-09-21 | 2010-09-28 | Reuters America, Llc | Common component framework |
US9390059B1 (en) * | 2006-12-28 | 2016-07-12 | Apple Inc. | Multiple object types on a canvas |
US10318624B1 (en) | 2006-12-28 | 2019-06-11 | Apple Inc. | Infinite canvas |
US8194107B2 (en) * | 2007-06-04 | 2012-06-05 | Ncr Corporation | Two-sided thermal print command |
US7949999B1 (en) | 2007-08-07 | 2011-05-24 | Amazon Technologies, Inc. | Providing support for multiple interface access to software services |
US8095922B2 (en) * | 2007-08-29 | 2012-01-10 | International Business Machines Corporation | Constructor argument optimization in object model for folding multiple casts expressions |
US8024371B2 (en) * | 2008-12-12 | 2011-09-20 | Microsoft Corporation | Managing inverse references between objects in object-oriented software |
US8250589B2 (en) * | 2009-04-03 | 2012-08-21 | Lsi Corporation | Method for simplifying interfaces having dynamic libraries |
US8533318B2 (en) * | 2009-10-06 | 2013-09-10 | International Business Machines Corporation | Processing and presenting multi-dimensioned transaction tracking data |
US8806433B2 (en) * | 2011-10-27 | 2014-08-12 | Reputation.com | Method and framework for software development |
JP5976930B2 (ja) * | 2012-08-08 | 2016-08-24 | インテル コーポレイション | バーチャルファンクションを無効にするコールのためのサポートを含むisaブリッジング |
CN109445845B (zh) * | 2018-09-10 | 2022-09-30 | 深圳市智美达科技股份有限公司 | 接口调用方法、装置、计算机设备和存储介质 |
Family Cites Families (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4695949A (en) * | 1984-07-19 | 1987-09-22 | Texas Instruments Incorporated | Method for efficient support for reference counting |
US5041992A (en) * | 1988-10-24 | 1991-08-20 | University Of Pittsburgh | Interactive method of developing software interfaces |
US5129084A (en) * | 1989-06-29 | 1992-07-07 | Digital Equipment Corporation | Object container transfer system and method in an object based computer operating system |
US5161223A (en) * | 1989-10-23 | 1992-11-03 | International Business Machines Corporation | Resumeable batch query for processing time consuming queries in an object oriented database management system |
US5161225A (en) * | 1989-10-23 | 1992-11-03 | International Business Machines Corporation | Persistent stream for processing time consuming and reusable queries in an object oriented database management system |
US5237654A (en) * | 1990-04-17 | 1993-08-17 | International Business Machines Corporation | Hierarchical inter-panel process flow control |
AU628264B2 (en) * | 1990-08-14 | 1992-09-10 | Oracle International Corporation | Methods and apparatus for providing a client interface to an object-oriented invocation of an application |
US5212787A (en) * | 1991-03-12 | 1993-05-18 | International Business Machines Corporation | Method and apparatus for accessing a relational database without exiting an object-oriented environment |
US5119475A (en) * | 1991-03-13 | 1992-06-02 | Schlumberger Technology Corporation | Object-oriented framework for menu definition |
US5297284A (en) * | 1991-04-09 | 1994-03-22 | Microsoft Corporation | Method and system for implementing virtual functions and virtual base classes and setting a this pointer for an object-oriented programming language |
EP0546682A3 (en) * | 1991-12-12 | 1993-12-08 | Ibm | Parent class shadowing |
EP0930566A3 (en) * | 1992-07-06 | 2006-07-05 | Microsoft Corporation | Method and system for composing objects |
DE69309485T2 (de) * | 1992-11-13 | 1997-07-10 | Microsoft Corp | Verfahren zur verteilung von schnittstellenzeigern fur fernprozeduranrufe |
US5805885A (en) | 1992-12-24 | 1998-09-08 | Microsoft Corporation | Method and system for aggregating objects |
CA2113417C (en) * | 1992-12-24 | 2000-02-22 | C. Douglas Hodges | Method and system for aggregating objects |
US5437025A (en) * | 1993-01-26 | 1995-07-25 | International Business Machines Corporation | System and method for run time configuration of objects in an object oriented computing environment |
US5495561A (en) | 1993-06-21 | 1996-02-27 | Taligent, Inc. | Operating system with object-oriented printing interface |
US5566278A (en) | 1993-08-24 | 1996-10-15 | Taligent, Inc. | Object oriented printing system |
US5485617A (en) * | 1993-12-13 | 1996-01-16 | Microsoft Corporation | Method and system for dynamically generating object connections |
US5559933A (en) | 1994-04-22 | 1996-09-24 | Unisys Corporation | Distributed enterprise print controller |
US5699495A (en) | 1994-07-27 | 1997-12-16 | Microsoft Corporation | Point-and-print in a distributed environment |
-
1994
- 1994-01-24 US US08/185,465 patent/US5805885A/en not_active Expired - Lifetime
-
1995
- 1995-01-13 CA CA002140166A patent/CA2140166C/en not_active Expired - Lifetime
- 1995-01-20 EP EP95100777A patent/EP0664510B1/en not_active Expired - Lifetime
- 1995-01-20 EP EP04018974A patent/EP1505495A3/en not_active Withdrawn
- 1995-01-20 EP EP04018958A patent/EP1505493A3/en not_active Withdrawn
- 1995-01-20 DE DE69533530T patent/DE69533530T2/de not_active Expired - Lifetime
- 1995-01-20 EP EP04018973A patent/EP1505494A1/en not_active Withdrawn
- 1995-01-23 JP JP00830895A patent/JP4322967B2/ja not_active Expired - Lifetime
- 1995-06-07 US US08/475,353 patent/US5710925A/en not_active Expired - Lifetime
- 1995-06-07 US US08/480,465 patent/US5745764A/en not_active Expired - Lifetime
-
1997
- 1997-03-04 US US08/810,418 patent/US6240465B1/en not_active Expired - Lifetime
- 1997-10-31 US US08/961,695 patent/US6243764B1/en not_active Expired - Lifetime
-
1998
- 1998-06-16 US US09/098,309 patent/US6412020B1/en not_active Expired - Fee Related
-
2001
- 2001-05-16 US US09/859,572 patent/US6526454B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US6412020B1 (en) | 2002-06-25 |
EP1505493A3 (en) | 2005-02-23 |
EP0664510A2 (en) | 1995-07-26 |
EP1505495A3 (en) | 2005-02-23 |
US5710925A (en) | 1998-01-20 |
US6243764B1 (en) | 2001-06-05 |
CA2140166A1 (en) | 1995-07-25 |
EP1505494A1 (en) | 2005-02-09 |
EP1505493A2 (en) | 2005-02-09 |
DE69533530T2 (de) | 2005-09-29 |
DE69533530D1 (de) | 2004-10-28 |
US5805885A (en) | 1998-09-08 |
US5745764A (en) | 1998-04-28 |
JPH0836493A (ja) | 1996-02-06 |
CA2140166C (en) | 2004-01-06 |
US6240465B1 (en) | 2001-05-29 |
US6526454B2 (en) | 2003-02-25 |
EP0664510A3 (en) | 1997-01-15 |
EP0664510B1 (en) | 2004-09-22 |
US20020040410A1 (en) | 2002-04-04 |
EP1505495A2 (en) | 2005-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4322967B2 (ja) | オブジェクト集合方法及びシステム | |
EP0660231B1 (en) | Method and system for dynamically generating object connections | |
US5842018A (en) | Method and system for referring to and binding to objects using identifier objects | |
EP0669020B1 (en) | Methods for marshalling interface pointers for remote procedure calls | |
US5682532A (en) | System and method having programmable containers with functionality for managing objects | |
US20050216670A1 (en) | Method and system for caching presentation data | |
US6088739A (en) | Method and system for dynamic object clustering | |
JPH10505693A (ja) | 異種オブジェクトシステム相互間にインタオペラビリティを提供するシステム及び方法 | |
JPH04230530A (ja) | オブジェクトの管理方法及びシステム | |
US6708196B1 (en) | Method and system for caching presentation data | |
US6952706B2 (en) | Method for providing stand-in objects | |
EP0603880B1 (en) | Method and system for aggregating objects | |
US9052883B2 (en) | Creating an object in an object-oriented programming platform | |
Squyres et al. | Object oriented MPI (OOMPI): A C++ class library for MPI |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20050404 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20050624 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20050629 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050929 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20051114 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060314 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060316 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20060328 |
|
A912 | Re-examination (zenchi) completed and case transferred to appeal board |
Free format text: JAPANESE INTERMEDIATE CODE: A912 Effective date: 20060929 |
|
RD13 | Notification of appointment of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7433 Effective date: 20090226 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20090226 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20090331 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20090604 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120612 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120612 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130612 Year of fee payment: 4 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
EXPY | Cancellation because of completion of term |