JP3672334B2 - オブジェクト集合方法およびシステム - Google Patents
オブジェクト集合方法およびシステム Download PDFInfo
- Publication number
- JP3672334B2 JP3672334B2 JP32811493A JP32811493A JP3672334B2 JP 3672334 B2 JP3672334 B2 JP 3672334B2 JP 32811493 A JP32811493 A JP 32811493A JP 32811493 A JP32811493 A JP 32811493A JP 3672334 B2 JP3672334 B2 JP 3672334B2
- Authority
- JP
- Japan
- Prior art keywords
- interface
- memory
- enclosed
- cpu
- member function
- 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
- 238000000034 method Methods 0.000 title claims abstract description 193
- 230000006870 function Effects 0.000 claims description 255
- 230000004044 response Effects 0.000 claims 1
- 230000004931 aggregating effect Effects 0.000 abstract description 3
- 238000012545 processing Methods 0.000 description 26
- 238000010586 diagram Methods 0.000 description 15
- 230000002776 aggregation Effects 0.000 description 10
- 238000004220 aggregation Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 7
- 150000001875 compounds Chemical class 0.000 description 5
- 230000003068 static effect Effects 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 239000011800 void material Substances 0.000 description 4
- 238000010276 construction Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005538 encapsulation Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000007796 conventional method Methods 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 238000007670 refining Methods 0.000 description 1
Images
Classifications
-
- 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
Description
【産業上の利用分野】
本発明は、一般にコンピュータにおいてオブジェクトに対する干渉を実行する方法およびシステムに関し、特に、オブジェクトを集合させる方法に関する。
【0002】
【従来の技術】
コンピュータソフトウェアシステムが複雑になるにつれ、ソフトウェアを開発するためのコストも増加している。ソフトウェア開発コストを最小限にするために、開発者らはコードを共用することが多い。従来の開発技術では、3つのタイプのコードを共用する。すなわち、(1)ソースコードの共用、(2)コンパイル済コードの共用、(3)継承中のコード共用、である。
ソースコードおよびコンパイル済コードを共用する方法は、長年広く使用されてきた。ソースコードの共用とは、さまざまなコンピュータプログラムまたは同一のコンピュータプログラムのさまざまなバージョンで同一のコードを使用することである。例えば、一般にスプレッドシートプログラムは、スップレッドシート表示を制御するソースコードを含む。ワードプロセッシングプログラムでスプレッドシートを文章内に埋め込むことができれば、そのワードプロセッシングプログラムは同一の(またはわずかに修正した)ソースコードを使用して、埋め込んだスプレッドシートオブジェクトを表示することができる。ソースコードは、一般に単独の開発者が複数のコンピュータプログラムを開発する際に共用される。他者と競争する関係上、開発者は他の開発者とコードを共用しない。さらに、コードを共用する場合でさえ、ソースコード受信者はソースコードを修正するのが一般的であり、この結果、ソースコードに対し2つのバージョンが維持されることになる。
【0003】
コンパイル済コードの共用とは、さまざまなコンピュータプログラムで同一のコンパイル済コードを使用することである。一般に、コンパイル済コードは静的リンクライブラリまたは動的リンクライブラリに格納される。静的リンクライブラリに格納されたコードは、実行前にコンピュータプログラムを連係した場合に共用される。例えば、スペルチェックプログラムの開発者は、そのプログラムをコンパイルして静的リンクライブラリにコンパイル済コードを格納することによってコンパイル済コードを共用できる。その後、静的リンクライブラリをワードプロセッシングプログラム開発者に分散することによって、これらの開発者はコンパイル済スペルチェックコードをそれぞれのワードプロセッシングプログラムに連係することができる。一般に、スペルチェックプログラム開発者は、コンパイル済コード修正して、特定開発者の特殊な要求に応じなければならない。こうした修正によって、コンパイル済コードの複雑化(とサイズの増大)を助長するだけでなく、他の受信者の要求と矛盾する可能性もある。他に、開発者が、静的リンクライブラリの複数のバージョンを分散することも考えられる。しかし複数のバージョンを保守するにはコストがかかりかねない。
【0004】
オブジェクト指向プログラミング技術には、継承という概念があり、コードの共用を許容することを意味する。この継承という概念を理解するには、一般に、オブジェクト指向プログラム技術を理解することが有益である。オブジェクト指向プログラミング言語では、データのカプセル化とデータ型の継承を支援するという2つの特徴が一般に知られている。データのカプセル化とは、関数とデータを結合させることである。継承は、あるデータ型を別のデータ型で宣言することである。
C++言語では、オブジェクト指向言語をクラスを使用して支援する。クラスはユーザが定義した型である。クラスの宣言によって、クラスのデータメンバとメンバ関数が定義される。例えば、下記の宣言はCIRCLEというクラスのデータメンバとメンバ関数とを定義する。
変数xおよびyは、円の中心座標を指定し、変数radiusはその円の半径を指定する。これらの変数をクラスCIRCLEのデータメンバという。関数drawは、ユーザが定義した関数で、指定座標から指定した半径で円を描く。この関数drawをクラスCIRCLEのメンバ関数という。あるクラスのデータメンバとメンバ関数を結合させると、関数がクラスのインスタンスで動作する。クラスのインスタンスは、クラスのオブジェクトとも呼ばれる。
【0005】
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();
導出クラスは、その基本クラスの特性、すなわちデータメンバとメンバ関数を継承するクラスである。例えば、下記の導出クラスCIRCLE FILLは、基本クラスCIRCLEを継承する。
【0006】
この宣言によって、クラスCIRCLE FILLが、クラスCIRCLE FILLの宣言時に導入したデータメンバとメンバ関数の他に、クラスCIRCLEに存在するすべてのデータメンバとメンバ関数、つまり、データメンバ patternとメンバ関数fillを含むことを指定する。ここでは、クラスCIRCLE FILLがデータメンバx、y、radiusならびにメンバ関数drawおよびfillを有している。この時、クラスCIRCLE FILLは、クラスCIRCLEの特性を「継承する」と言う。他のクラスの特性を継承するクラスが、導出クラス(CIRCLE FILLなど)である。他のクラスの特性を継承しないクラスを一次クラス(ルートクラス)という(CIRCLEなど)。他クラスによって特性が継承されるクラスは、基本クラスである(例えば、CIRCLEは、CIRCLE FILLの基本クラスである)。導出クラスは、複数のクラス特性を継承することができる。つまり、導出クラスは複数の基本クラスを有することができる。これを多重継承という。
【0007】
導出クラスは、基本クラスが仮想的に継承されるものであることを指定することができる。基本クラスの仮想継承とは、仮想基本クラスのインスタンスが導出クラス中の1つしか存在しないことを意味する。例えば、下記は非仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : CIRCLE { , , ,};
class CIRCLE 2 : CIRCLE { , , ,};
class PATTERN : CIRCLE 1, CIRCLE 2 { , , ,};
この宣言では、クラスPATTERN は非仮想的に2度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。つまり、クラスPATTERN にはクラスCIRCLEのインスタンスが2つ存在するのである。
下記は、2つの仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : virtual CIRCLE { , , ,};
class CIRCLE 2 : virtual CIRCLE { , , ,};
class PATTERN : CIRCLE 1, CIRCLE 2 { , , ,};
導出クラスPATTERN は、仮想的に2度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。クラスCIRCLEは、2度仮想的に継承されるので、導出クラスPATTERN には、クラスCIRCLEのオブジェクトが1つしか存在しないことになる。クラス導出が複雑な場合に、仮想継承が非常に有益であると評価する当業者もいるであろう。
【0008】
クラスは、そのメンバ関数仮想的であるかどうかによっても指定することができる。あるメンバ関数が仮想的であると宣言することは、その関数が導出クラスにおいて同一名および同一型の関数によって優先され得ることを意味する。下記の例では、関数drawをクラスCIRCLEとCIRCLE FILLで仮想的であると宣言している。
C言語は、ポインタデータ型を提供する。ポインタはメモリ中のオブジェクトのアドレス値を保持する。ポインタを介在に、オブジェクトに参照を付することができる。下記のステートメントは、変数 c ptr がクラスCIRCLE型のオブジェクトのポインタであることを宣言し、変数 c ptr をセットしてオブジェクトのアドレスを保持する。
【0009】
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である。
【0010】
図1は、オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。オブジェクトはインスタンスデータ(データメンバ)およびメンバ関数であり、オブジェクトを実際に動作させる。オブジェクトの表現に使用するデータ構造は、インスタンスデータ構造101と、仮想関数表102と、メンバ関数103、104および105から成る。インスタンスデータ構造101は、仮想関数表102に対するポインタとデータメンバを含む。仮想関数表102は、オブジェクトに対して定義した各仮想メンバ関数のエントリを含む。各エントリは、対応するメンバ関数を提供するコードへの参照を含む。このサンプルオブジェクトのレイアウトは、米国特許出願第07/682,537 号「A Methodfor Implementing Virtual Function and Virtual Bases in a Compiler for anObject Oriented Programming Language」に従っており、本明細書中に参照として取り入れた。以下において、オブジェクトを、C++プログラミング言語で定義したクラスのインスタンスとして述べる。当業者には、オブジェクトは他のプログラミング言語を使用して定義できると評価するものもいる。
クラスの継承は、コード共用の1形式である。クラス開発者は、他の開発者にクラスの処理系を提供することができる。この他の開発者は、提供されたクラスから導出するクラスを作成することができる。ただし、クラスが継承されて、仮想関数が優先される場合は、優先する仮想関数のテストは複雑になることが考えられる。優先仮想関数は、非優先関数に影響を与えながら、オブジェクトの状態を修正する。このため、各継承関数は、優先仮想関数のテストと同時に独立したテストをする必要がある。テストの複雑さを改善するには、クラス処理系の開発者は処理系でソースコードを分散することができる。残念ながら、ソースコードを分散すると、上述のように、共用ソースコードに同様の支障が生じる。
【0011】
オブジェクト指向技術の利点は、オブジェクトの共用を容易にできることである。特に、オブジェクト指向技術は複合文書の作成を容易にする。複合文書は、さまざまなコンピュータプログラムによって生成されたオブジェクトを含む文書である。(一般に、オブジェクトのデータメンバとクラス型のみが複合文書に格納される。)例えば、スプレッドシートプログラムで生成したスプレッドシートオブジェクトを含むワードプロセッシング文書は、複合文書である。ワードプロセッシングプログラムでは、ユーザは(セルなど)スプレッドシートをワードプロセッシング文書内に埋め込むことができる。この埋め込みは、ワードプロセッシングプログラムを、埋め込むべきオブジェクトのクラス定義を使用して埋め込んだオブジェクトのメンバ関数にアクセスして、コンパイルすることによって可能となる。このため、ワードプロセッシングプログラムは、ワードプロセッシング文書に埋め込むことができるオブジェクトの各クラスのクラス定義を使用してコンパイルしなければならないだろう。新しいクラスのオブジェクトをワードプロセッシング文書に埋め込むには、ワードプロセッシングプログラムは新たなクラス定義でリコンパイルしなければならないと考えられる。このため、ワードプロセッシングプログラムの開発者が選択したクラスオブジェクトだけを埋め込むことができる。さらに、新たなクラスをワードプロセッシングプログラムを新たにリリースしてのみ支援することができる。
【0012】
任意クラスのオブジェクトを複合文書に埋め込むには、どうすればオブジェクトをワードプロセッシングプログラムがコンパイル時間にクラス定義にアクセスする必要なしにアクセスできるかで、インタフェースを定義する。抽象クラスは仮想メンバ関数が処理系を持たない(純粋な)クラスである。インタフェースはデータメンバがない抽象クラスであり、その仮想関数はすべて純粋である。
以下のクラス定義は、インタフェースの定義の一例である。この例では、説明を簡略にするために、オブジェクトのクラスを問わず文書に埋め込ませるより、むしろ、ワードプロセッシングプログラムでスプレッドシートオブジェクトを埋め込ませている。オブジェクトがどのように処理されたかを問わず、このインタフェースを提供するスプレッドシートはすべて埋め込むことができる。さらに、ワードプロセッシングプログラムをコンパイルする前あるいは後に処理されたかに関係なく、スプレッドシートを問わず埋め込むことができる。
スプヘレッドシートプログラムの開発者は、インタフェースの処理系を供給して、スプレッドシートオブジェクトをワードプロセッシング文書に埋め込ませる必要があるだろう。ワードプロセッシングプログラムによってスプレッドシートオブジェクトを埋め込ませる場合、そのプログラムはスプレッドシートオブジェクトに対するインタフェースを実現するコードにアクセスしなければならない。そのコードにアクセスするために、各処理系には独特のクラス識別子が与えられる。例えば、Microsoft Corporation が開発したスプレッドシートオブジェクトは、「MSSpreadsheet 」というクラス識別子を有することができる。また、他社開発のスプレッドシートオブジェクトは、「LTSSpreadsheet」という識別子を有することができる。各コンピュータシステムでは常駐登録簿を維持して、各クラス識別子をクラスを実現するコードにマップする。一般に、スプレッドシートプログラムがコンピュータシステムにインストールされると、常駐登録簿を更新し、スプレッドシートオブジェクトのクラスの可用性を反映する。スプレッドシート開発者がインタフェースによって定義した各メンバ関数を処理し常駐登録簿を維持する限り、ワードプロセッシングプログラムは開発者のスプレッドシートオブジェクトをワードプロセッシング文書に埋め込むことができる。
【0013】
しかし、さまざまなスプレッドシート開発者が特定のメンバ関数のみ実行したいと願っていることだろう。例えば、あるスプレッドシート開発者はデータベース支援を実行したくないが、その他のメンバ関数は支援したいと考えているかもしれない。オブジェクトを埋め込むことができる上に、スプレッドシートの開発者がメンバ関数の一部のみを支援できるようにするには、スプレッドシートオブジェクトに対して複数のインタフェースを定義する。インタフェースIDatabase およびIBasicなどを、下記のようにスプレッドシートに定義することができる。
各スプレッドシート開発者らはIBasicインタフェースを、選択的にIDatabase を実行したいと考えるであろう。
【0014】
実行時において、ワードプロセッシングプログラムは埋め込むべきスプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを決定しなくてはならなくなる。この決定の際に、別のインタフェースをどのインタフェースをオブジェクトに埋め込むことができるかを指示するメンバ関数を用いて(すべてのスプレッドシートオブジェクトが実行することを)定義する。このインタフェースはIUnknownという名で、(未確認インタフェースあるいはオブジェクト管理インタフェースと呼ばれ、)下記のように定義される。
このIUnknownインタフェースは、メンバ関数(メソッド)QueryInterfaceを定義する。メソッドQueryInterfaceは、(REFIID型の)パラメータiid 中の(IDatabase などの)インタフェース識別子に渡されて、ポインタをこのメソッドがパラメータppv に呼び出されるオブジェクト用に識別したインタフェースの処理系に戻す。このオブジェクトがインタフェースを支援しなければ、このメソッドは偽に戻る。
【0015】
コード表1は、クラスXX対応のメソッドQueryInterfaceの一般的な処理系に対するC++のソースコードを含み、クラスIUnknownを継承する。スプレッドシートオブジェクトがIDatabase インタフェースを支援する場合、メソッドQueryInterfaceはswitch文内に適切なcaseラベルを含む。変数pIBasic とpIDatabaseは、ポインタをIBasicインタフェースとIDatabase インタフェースの仮想関数表へそれぞれポイントする。インタフェースへのポインタが戻されると、メソッドQueryInterfaceは(以下の) メソッドAddRefを呼び出し、クラスXXのオブジェクトに対する参照カウント値をインクリメントする。
【0016】
インタフェースIUnknownは、メソッドAddRefおよびRelease も定義する。これらは、参照カウントの実行に使用される。インタフェースに対し新たな参照を作成する度に、メソッドAddRefを呼び出し、オブジェクトの参照カウント値をインクリメントする。参照が不要になる度に、メソッドRelease を呼び出し、オブジェクトの参照値をディクリメントし、参照値が0になった場合にはオブジェクトの割当てを解除する。コード表2は、クラスXXに対応するメソッドAddRefおよびRelease の一般的な処理系に対するC++のソースコードを含み、クラスIUnknownを継承する。
IDatabase インタフェースとIBasicインタフェースはIUnknownインタフェースを継承する。下記の定義は、IUnknownインタフェースの使用法を示す。
図2は、スプレッドオブジェクトのサンプルデータ構造を示すブロック図である。このスプレッドオブジェクトは、オブジェクトデータ構造201と、IBasicインタフェースデータ構造204と、仮想関数表202、205および206と、メソッド207乃至221とを含む。オブジェクトデータ構造201は、仮想関数表202に対するポインタとIBasicインタフェースおよびIDatabase インタフェースに対するポインタとを含む。仮想関数表202の各エントリは、IUnknownインタフェースのメソッドへのポインタを含む。IBasicインタフェースデータ構造203は、仮想関数表205へのポインタを含む。仮想関数表205の各エントリは、IBasicインタフェースのメソッドに対するポインタを含む。IDatabase インタフェース構造204は、仮想関数表206に対するポインタを含む。仮想関数表207の各エントリは、IBasicインタフェースのメソッドのポインタを含む。IBasicインタフェースおよびIDatabase インタフェースは、IUnknownインタフェースを継承し、仮想関数表205および206は、メソッドQueryInterface、AddRefおよびRelease を各々含む。下記において、オブジェクトデータ構造は、オブジェクトがアクセスできるインタフェースでラベル付けした形式222によって表わされる。
【0017】
下記の擬似コードでは、ワードプロセッシングプログラムが、スプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを定義する方法を示す。
ポインタ pIBasicは、オブジェクトのIBasicインタフェースに対するポインタである。このオブジェクトがIDatabase インタフェースを支援する場合は、メソッドQueryInterfaceはポインタpIDatabaseをセットし、IDatabase データ構造にポイントして、その値通り真に戻る。
通常、オブジェクトを変数宜言または「新たな」オペレータによって具体化することができる(メモリ内に作成したオブジェクトのインスタンス)。ただし、どちらの実現化技術でも、実行時にワードプロセッシングプログラムにスプレッドオブジェクトを実現化させる必要がある。広域関数CreateInstanceXXを供給する技術もあり、下記のように定義される。
【0018】
static void CreateInstanceXX(REFIID iid, void**ppv) = 0 ;
メソッドCreateInstanceXXは、クラスXXのオブジェクトを実現化し、ポインタppv をパラメータiid によって定義したオブジェクトのインタフェースに戻す。
【0019】
【発明が解決しようとする課題】
上述のように、従来の技術では、ソフトウェアの開発者らが所望のコードを共用する際にその手続きが複雑になるという欠点があった。
したがって、本発明の目的は、オブジェクトを集合させるための方法とそのシステムを提供することにある。
本発明の別の目的は、オブジェクトを別のオブジェクト内に囲む一方、囲まれたオブジェクトのインタフェースを、囲んでいるオブジェクトのクライアントに提示する方法とそのシステムを提供することにある。
また、本発明の別の目的は、別のオブジェクト内に囲むことができるか、オブジェクトの処理系を修正せずには別のオブジェクト内に囲むことができないオブジェクトを実現するための方法およびシステムを提供することにある。
さらに、本発明の別の目的は、集合オブジェクトを実現し、クライアントがオブジェクトが集合体であることを意識させないための方法およびシステムを提供することにある。
本発明のもっと別な目的は、オブジェクトを囲むことによって、囲まれたオブジェクト自体が、任意のレベルの囲いに対して囲いをするオブジェクトと成りうる方法およびシステムを提供することにある。
【0020】
上記の目的を含めた他の目的は、本発明の以下の記載で明らかなように、コンピュータシステム内でオブジェクトを集合させる方法およびシステムによって提供される。本発明の方法は、囲まれたオブジェクトを、囲んでいるオブジェクト内に集合させることが好ましい。この囲まれたオブジェクトは、オブジェクト管理インタフェースと1以上の外部インタフェースを有し、これを囲むオブジェクトが制御オブジェクト管理インタフェースを有する。集合オブジェクトによってクライアントに提示した各インタフェースは、質問メンバ関数を有しインタフェースの識別子を受取って、識別済のインタフェースに参照を戻す。囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数は、囲んでいるオブジェクトによって提示されたインタフェースの識別子を受取り、提示したインタフェースに参照を戻す。本発明の好ましい方法では、囲まれたオブジェクトのインスタンスを作成する。囲まれたオブジェクトの提示したインタフェースの質問メンバ関数は、インタフェースの識別子を受取り、受け取った識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、さらに、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済インタフェースの参照として戻す。
【0021】
本発明では、囲まれたオブジェクトの質問メンバ関数は、囲まれたオブジェクトの外部インタフェースの知識を用いて実現され、囲んでいるオブジェクトまたは他の囲まれたオブジェクトの(制御オブジェクト管理インタフェース以外の)インタフェースの知識を有さないのが好ましい。
【0022】
【課題を解決するための手段】
上記目的を達成するために、本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトは、オブジェクト管理インタフェースおよび外部インタフェースを有し、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有し、各インタフェースは、インタフェースの識別子を受け取るための質問メンバ関数と識別済のインタフェースに参照を戻すことによって、コンピュータシステム内で、前記囲まれるオブジェクトを前記囲んでいるオブジェクト内に集合させるためのオブジェクト集合方法において、囲んでいるオブジェクトのインタフェースを作成することによって、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースの識別子を受取り、外部インタフェースへ参照を戻すステップと、囲まれたオブジェクトのインスタンスを作成して、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、該受け取られた識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースのメンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済のインタフェースに対する参照として戻すステップと、を有することを特徴とする。
【0023】
このため、本発明のオブジェクト集合方法およびシステムは、前記オブジェクトが集合オブジェクトであることを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記集合オブジェクトが集合可能なオブジェクトでないことを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該囲まれたオブジェクトの外部インタフェースに関し、特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースに関する特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、該囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトが囲まれているオブジェクトの外部インタフェースを格納して、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該格納された参照を囲まれたオブジェクトの外部インタフェースとして戻す。
【0024】
本発明のオブジェクトの集合方法およびシステムは、クラスはオブジェクト管理インタフェースおよび外部インタフェースを有し、該オブジェクト管理インタフェースと外部インタフェースは各インタフェースにアクセスするための質問メンバ関数を有し、集合オブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクト集合方法およびシステムにおいて、作成インスタンスメンバ関数を生成しクラスのオブジェクトを具体化し、作成インスタンスメンバ関数がオブジェクトを集合させない場合にはクラスのデータメンバ中にクラスのオブジェクト管理インタフェースに対する参照を格納し、データを集合させる場合にはクラスのデータメンバ中に囲んでいるオブジェクトの制御オブジェクト管理インタフェースに対する参照を格納するステップと、オブジェクト管理インタフェースの質問メンバ関数を生成することによって、質問メンバ関数がインタフェースの識別子を受取り、識別されたインタフェースに対して参照を戻すステップと、外部インタフェースの質問メンバ関数を生成して、質問メンバ関数がインタフェースの識別子を受取り、該インタフェースの識別子を渡すデータメンバによって参照を付せられたオブジェクト管理インタフェースを呼び出し、該呼び出された質問メンバ関数によって戻される参照を戻すステップと、を有する。
【0025】
本発明のオブジェクト集合方法およびシステムは、クラスのオブジェクトを実現化するためのグローバル作成インスタンス関数を生成し、グローバル作成インスタンス関数が作成インスタンスメンバ関数を呼び出しクラスのインスタンスを作成し、かつ、オブジェクト管理インタフェースから質問メンバ関数を呼び出しクラスの外部インタフェースに対する参照を検索することによって、グローバル作成インスタンス関数をクライアントによって呼び出し、クライアントがクラスに対するクラス定義にアクセスする必要なく、クラスのインスタンスを作成するステップを有する。
本発明のオブジェクトの集合方法およびシステムは、集合オブジェクトを作成し、集合オブジェクトは囲まれたオブジェクトを有し、囲まれたオブジェクトは集合体によって提示される外部インタフェースを有するオブジェクト集合方法およびシステムにおいて、集合オブジェクトを具体化し、集合オブジェクトが質問メンバ関数を有して、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトを具体化し、囲まれたオブジェクトが外部インタフェースの質問メンバ関数を有し、集合オブジェクトによって指示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトに対する参照を格納し、集合オブジェクトの質問メンバ関数は囲まれたオブジェクトに対して格納した参照を使用し、提示された外部インタフェースに対する参照を検索するステップと、集合オブジェクトに対する参照を格納し、外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、を有する。
【0026】
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照されたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照は、囲まれたオブジェクトの外部インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数は、外部インタフェースに対する参照を提示された外部インタフェースに対する参照として使用するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を使用し、集合オブジェクトの質問メンバ関数を呼び出し、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照オブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する。
【0027】
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースが加算参照を供給し、参照計数メンバ関数を解放し、集合オブジェクトが加算参照を供給し参照計数関数を解放し、囲まれたオブジェクトの外部インタフェースの参照計数メンバ関数が集合オブジェクトの参照計数メンバ関数を呼び出すステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲んでいるオブジェクト内に囲まれたオブジェクトに対する参照を格納するステップとを有し、囲んでいるオブジェクトの質問メンバ関数を実行する場合に、囲まれたオブジェクトの質問メンバ関数を呼び出し、囲まれたオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示された外部インタフェースに対する参照を検索する。
【0028】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲まれたオブジェクト内に囲んでいるオブジェクトに対する参照を格納するステップとを有し、囲まれたオブジェクトの質問メンバ関数を実行する場合に、囲んでいるオブジェクトの質問メンバ関数を呼び出し、囲んでいるオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示されたインタフェースに対する参照を検索する。
【0029】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトの質問メンバ関数を囲まれたオブジェクトの外部インタフェースに対応させ、囲まれたオブジェクトが質問メンバ関数を備えたオブジェクト管理インタフェースを有し、囲んでいるオブジェクトの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースに質問メンバ関数を呼び出し、囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステム集合オブジェクトが囲まれるオブジェクトと囲んでいるオブジェクトを有し、囲んでいるオブジェクトが参照カウントと加算参照メンバ関数と解放メンバ関数とを有し、囲まれたオブジェクトが加算参照メンバ関数と解放参照メンバ関数とを有し、集合オブジェクトに対して参照の計数を行なうオブジェクト集合方法およびシステムにおいて、囲まれたオブジェクトの加算参照メンバ関数の制御下で、囲んでいるオブジェクトの加算メンバ関数を呼び出し、囲んでいるオブジェクトの加算参照メンバ関数が参照カウントをインクリメントするステップと、囲まれたオブジェクトの解放参照メンバ関数の制御下で、囲いでいるオブジェクトの解放参照メンバ関数を呼び出し、囲んでいるオブジェクトの解放参照メンバ関数が参照カウントをディクリメントするステップと、を有する。
【0030】
本発明のオブジェクト集合方法およびシステムは、参照カウントが集合オブジェクトに対する参照が存在しないことを示した場合、囲んでいるオブジェクトと囲まれたオブジェクトを削除する。
本発明のオブジェクト集合方法およびシステムは、クラスがオブジェクト管理インタフェースと外部インタフェースとを有し、オブジェクト管理インタフェースと外部インタフェースがそれぞれ質問メンバ関数を有して、集合可能なオブジェクトのインタフェースにアクセスし、集合可能なオブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクトの集合方法およびシステムにおいて、外部インタフェースを定義するステップと、集合可能なクラスを定義し、集合可能なクラスが定義された外部インタフェースを基本クラスとして継承し、集合クラスが定義された外部インタフェースの質問メンバ関数の処理系を有し、オブジェクトを集合させていない場合には、定義された外部インタフェースの質問メンバ関数がオブジェクト管理インタフェースを呼び出し、集合可能なオブジェクトを集合させている場合には、集合しているオブジェクトの質問メンバ関数を呼び出すことを特徴とするステップと、を有する。
【0031】
本発明のオブジェクトの集合方法およびシステムは、コンピュータシステムの集合オブジェクトが、オブジェクトのインタフェースの識別子を受取り、インタフェースに対して参照を戻すための質問メンバ関数を有するオブジェクト管理インタフェースと、インタフェースの識別子を受取り、オブジェクトを集合させていない場合にはオブジェクト管理インタフェースの質問メンバ関数が呼び出し、オブジェクトを集合させている場合には、囲んでいるオブジェクトの質問メンバ関数を呼び出し、識別されたインタフェースに対する参照を戻すための質問メンバ関数を有する外部インタフェースと、を含む。
【0032】
【実施例】
本発明は、コンピュータシステムにおいてオブジェクトを集合させる方法を提供する。態様としては、集合オブジェクトがそのクライアントに複数のインタフェースを供給することが好ましい。オブジェクトを具体化するコンピュータプログラムをクライアントと呼ぶ。集合オブジェクトは、1つ以上の囲まれたオブジェクトとIUnknownインタフェースの処理系とからなり、この処理系を集合オブジェクトの制御IUnknownインタフェースと呼ぶ。集合オブジェクトは、そのクライアントにそれ自体のインタフェースと囲まれたオブジェクトからのインタフェースを提示する。制御IUnknownインタフェースのメソッドQueryInterfaceはポインタを集合オブジェクトによって提示された各インタフェースに戻す。集合オブジェクトは各囲まれたオブジェクトを具体化する。この具体化は、集合オブジェクトの構成を通じてできるし、囲まれたオブジェクトのインタフェースが必要になるまで延期することもできる。各囲まれたオブジェクトは、制御IUnknownインタフェースに対するポインタを含む。囲まれたオブジェクトの提示したインタフェースのメソッドQueryInterfaceは、IUnknownインタフェースのメソッドQueryInterfaceの呼び出しを実現できることが好ましい。囲まれたオブジェクトを実現した場合、一般に開発者らは囲んでいるオブジェクトがどのインタフェースを提示するかについての知識はない。結果的に、囲まれたオブジェクトのメソッドQueryInterfaceが制御IUnknownインタフェースを呼び出して、要求したインタフェースのポインタを検索する。制御IUnknownインタフェースのメソッドQueryInterfaceは、一般に提示したすべてのインタフェースの知識をもって実現される。オブジェクトが囲まれていない場合、制御IUnknownインタフェースは、そのオブジェクトのIUnknownインタフェースであり。逆に、オブジェクトが囲まれている場合は、制御IUnknownインタフェースは囲んでいるオブジェクトのIUnknownインタフェースである。
【0033】
本発明では、集合オブジェクトが参照カウントを維持することが好ましい。集合オブジェクトを具体化した場合、その参照カウントは1にセットされる。制御IUnknownのメソッドQueryInterfaceは、参照がクライアントに戻されると、参照カウントをインクリメントする。囲まれたオブジェクトの提示されたインタフェースのメソッドAddRefは、制御IUnknownインタフェースのメソッドAddRefを呼び出し、集合オブジェクトの参照カウントをインクリメントする。同様に囲まれたオブジェクトの提示されたインタフェースのメソッドRelease は、制御IUnknownインタフェースのRelease を呼び出し、集合オブジェクトの参照カウントをディクリメントし、参照カウントが0ならば集合オブジェクトを削除する。囲まれたオブジェクトを具体化した場合、囲まれたオブジェクトの参照カウントは0にセットされる。集合オブジェクトが削除された場合、各囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、囲まれたオブジェクトを消去する。
本発明によるオブジェクト集合方法およびシステムは、中央演算処理装置(CPU)、メモリおよび入出力装置を含むコンピュータで実行されることが好ましい。
【0034】
図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インタフェースに対するポインタを含む。
【0035】
提示されたインタフェースのメソッドQueryInterfaceは、ポインタを提示された各インタフェースに戻し、ポインタが戻されたときに集合オブジェクトの参照カウントをインクリメントすることができる。制御IUnknownのメソッドQueryInterfaceは、処理系I3を実現し、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して、囲まれたオブジェクトS1およびS2の提示されたインタフェース−−CおよびF−−に対するポインタを検索するインタフェース−−A、Bおよび制御IUnknown−−に対するポインタに直接アクセスする。囲まれたインタフェースに対するポインタを戻すと、制御IUnknownインタフェースのメソッドQueryInterfaceは、制御IUnknownインタフェースのメソッドAddRefを呼び出すことによって、集合オブジェクトS3の参照カウントをインクリメントする。(制御IUnknownインタフェース以外の)各提示されたインタフェースのQueryInterfaceは、制御IUnknownインタフェースのメソッドQueryInterfaceを呼び出すことが好ましい。
コード表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の構成子である。
【0036】
コード表3に示したように、メソッドS1::QueryInterfaceはインタフェースC、インタフェースDまたはインタフェースIUnknownに対するポインタを戻し、メソッドS1::AddRefを呼び出し、オブジェクトS1の参照カウントをインクリメントする。メソッドS1::AddRefは参照カウントをインクリメントして、メソッドS1::Release は参照カウントをディクリメントし、参照カウントが0になった場合はオブジェクトS1を削除する。
グローバル関数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が必要となくなったからである。
メソッドS1::CreateInstanceはオブジェクトS1を具体化し、オブジェクトS1のIUnknownインタフェースに対するポインタ(ppunk)を戻す。メソッドS1::CreateInstanceは、制御IUnknownに対するポインタ(punkOuter)に渡される。メソッドS1::CreateInstanceは新たにオペレータを使用して、オブジェクトS1を具体化する。具体化している間に、構成子S1::S1を呼び出し、パラメータpunkOuter の値に渡す。オブジェクトS1が構成された後、メソッドCreateInstanceは、メソッドS1::QueryInterfaceを呼び出し、オブジェクトS1のIUnknownインタフェースに対するポインタを検索する。
【0037】
構成子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をゼロに初期化もする。
構成子C::Cは、オブジェクトS1に対するポインタに渡される。構成子C1::C1は、渡されたポインタをC::m pS1 内に格納する。データメンバC::m pS1 は、クラスCのメソッドによって使用され、データメンバS1:: m punkOuter にアクセスする。
【0038】
メソッドC::QueryInterface 、C::AddRef およびC::Releaseは、データメンバS1:: m punkOuter によってポイントされるIUnknownインタフェースの中で対応するメソッドを呼び出し、これによってオブジェクトS1が囲まれている場合には、集合体の制御IUnknownInterface にポイントする。
クラスDの構成子およびその他のメソッドはクラスCの構成子およびその他のメソッドに類似している。
図4は、集合体の部分以外のオブジェクトS1のインスタンスである。データメンバS1::C::m pS1 、S1::D::m pS1 および S1::m punkOuter は、オブジェクトS1自体に対するポインタに初期化される。データメンバ m C およびm D のメソッドQueryInterface、AddRefおよびRelease は、オブジェクトS1のインタフェースのIUnknownメソッドを呼び出す。
インタフェースEおよびFを実現するオブジェクトS2は、上述のオブジェクトS2と類似している。
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:
コード表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はこれらのインタフェースを提示しない。
【0039】
メソッドS3::QueryInterface、S3::AddRefおよびS3::Release は、集合体の制御IUnknownインタフェースを構成する。メソッドS3::QueryInterfaceは、制御IUnknownインタフェースA、B、CまたはFに対するポインタを戻し、オブジェクトS3に対する参照カウントをインクリメントする。メソッドS3::AddRefは、参照カウントをインクリメントし、メソッドS3::Release は参照カウントをディクリメントし参照カウントが0になるとオブジェクトS3を削除する。
グローバル関数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 を呼び出す。
【0040】
メソッドS3::CreateInstanceは、オブジェクトS3を具体化し、オブジェクトS3のIUnknownに対するポインタ(ppunk)を戻す。メソッドS3::CreateInstanceは、制御IUnknownに対するポインタ(punkOuter)に渡される。メソッドS3::CreateInstanceは、新たにオペレータを使用してオブジェクトS3を具体化する。具体化を通じて、構成子S3::S3を呼び出し、パラメータpunkOuter に渡す。オブジェクトS3が構成された後、メソッドS3::CreateInstanceは関数CreateInstanceS1を呼び出して囲まれたオブジェクトS1を作成する。メソッドS3::S3CreateInstanceはパラメータ m p01->punkOuterおよびIUnknownインタフェース対応のインタフェース識別子を渡して、オブジェクトS1のIUnknownインタフェースに対するポインタに戻される。メソッドS3::CreateInstanceは、データメンバS3:: m punkS1内に戻されたポインタを格納する。メソッドS3::CreateInstanceは、関数CreateInstanceS2を呼び出し、オブジェクトS1の作成と同様の方法でオブジェクトS2を作成する。メソッドS3::CreateInstanceは、パラメータiid によって識別されたインタフェースに対するポインタを検索する。
メソッドS3::AddRefは、オブジェクトS3の参照カウントをインクリメントする。メソッドS3::Release は、参照カウントをディクリメントする。参照カウントが0になると、メソッドS3::Release は、オブジェクトS3を削除する。
【0041】
構成子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に初期化する。
消去関数S3::-S3 は、メソッドS1::Release を呼び出して、囲まれたオブジェクトS1の参照カウントをディクリメントする。オブジェクトS1の具体化を通じ、参照カウントはすでに1にセットされているので、メソッドS1::Release はオブジェクトS1を削除する。消去関数S3::-S3 は、同様の方法でオブジェクトS2の参照カウントをディクリメントする。
【0042】
インタフェースAおよびBは、インタフェースCのメソッドに同様の動作をする。こうしてインタフェースAおよびBは、オブジェクトS3が囲まれた場合に提示できる。
図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・515のIUnknownインタフェースをポイントするデータメンバ m punkS2とに対応した仮想関数表に対するポインタを含む。囲まれたオブジェクトS1が具体化されると、そのデータメンバ S1::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースをポイントする。同様に囲まれたオブジェクトS2が具体化されると、そのデータメンバ S2::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースをポイントする。
【0043】
図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のデータメンバ mpunkOuter 602は、クラスS3のオブジェクト610のIUnknownインタフェースをポイントする。メソッドIUnknown::QueryInterface613は、提示された各オブジェクトに対するポインタを戻し、データメンバ m punkS1・619によってポイントされるメソッドIUnknown::QueryInterface603を呼び出し、インタフェースCに対するポインタを検索する。クラスAおよびBのメソッドQueryInterface615および617は、データメンバ m punkOuter 612によって示されるメソッドを呼び出す。
【0044】
上述の本発明の実施例において、集合体の制御IUnknownインタフェースのメソッドQueryInterfaceは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、提示されたインタフェースに対するポインタを検索する。本発明の別の実施例においては、囲んでいるオブジェクトが提示する囲まれたオブジェクトのインタフェースに対するポインタを、囲んでいるオブジェクトを変換することができる。このため、制御IUnknownのメソッドQueryInterfaceが呼び出されると、このメソッドは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出すというよりは、変換されたポインタを検索して戻すことができる。この別の実施例を実現するためは、囲んでいるオブジェクトによって、各変換されたポインタに対応したデータメンバを定義する。(一般に囲んでいるオブジェクトの構成中に)囲まれたオブジェクトが具体化された場合、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して提示されたインタフェースのポインタを検索する。検索されたポインタが参照カウントされず、囲んでいるオブジェクトが囲まれたオブジェクトに対して1つのポインタのみを効果的に維持することが好ましい(S3:: m punkS1など)。囲まれたオブジェクトは、メソッドRelease に対して1回のコールだけで削除することができる。したがって、ポインタを変換した後、囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、変換されたポインタに属する参照カウントを除去する。
【0045】
上述の本発明の実施例において、制御IUnknownインタフェースのメソッドQueryInterfaceの処理系は、どのインタフェースが提示されるかを指定するswitch文を含む。例えば、メソッドS3::QueryInterfaceのswitch文は、提示された各インタフェースA、B、CおよびFと制御IUnknownに対するcaseラベルを含む。このため、提示されたインタフェースは囲んでいるオブジェクトの実現中に静的に定義される。別の実施例においては、制御IUnknownインタフェースメソッドQueryInterfaceを囲まれたオブジェクトの外部インタフェースに関する知識を特に必要としなくても実現できる。実現しないインタフェースに対するポインタを要求したとき、メソッドQueryInterfaceは囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、囲まれたオブジェクトによって実現されていれば、識別されたインタフェースに対するポインタを検索する。コード表5は、オブジェクトS3に対する制御IUnknownインタフェースのメソッドQueryInterfaceのC++処理系であり、本発明の別の1実施例である。かこまれたオブジェクトの外部インタフェースに対するポインタを戻すことに加えて、制御IUnknownのメソッドQueryInterfaceは、他のすべての外部インタフェースを提示する一方で、特定の外部インタフェースを提示せずに実現することができよう。
【0046】
上述の実施例において、エラーチェックについては述べなかった。さまざまな種類のエラーチェックを実行して、集合体が適切に作成されることを確認することが望ましい。例えば、囲んでいるオブジェクトが集合できないオブジェクトを囲もうとした場合、囲んでいるオブジェクトの具体化に障害がおきるようにするなどである(関数CreateInstanceS1が障害を示すフラッグを戻すなど)。
【0047】
上述の実施例では、集合オブジェクト自体が、囲んでいるオブジェクト内に囲まれたオブジェクトとなりうる。この囲い込み(ネスティング)は深さを問わず起こりうる。また、集合オブジェクトが集合不可能にすることもできる。クラスXXに対応する関数CreateInstanceXXは、パラメータpunkOuter がヌルでない場合、すなわち、集合が所望される場合に障害を示すフラグを戻すことができる。
上述の実施例では、集合オブジェクトの各外部インタフェースに対応するオブジェクトは、集合オブジェクトのデータメンバとして、具体化される。これに代わる実施例では、集合オブジェクトのデータメンバとして実現されるよりむしろ、外部インタフェースが集合オブジェクトによって継承される。コード表6は、外部インタフェースCおよびDを有する集合クラスのC++クラス定義を含む。クラスS1は、抽象クラスICおよびIDを継承する。インタフェースICおよびIDの処理系は導出クラスS1に対するポインタを格納してデータメンバ m punkOuter にアクセスする必要はない。逆に、インタフェースICおよびIDの処理系は、コード表3に示すように、導出クラスに対するポインタをデータメンバ m pS1 に格納する。インタフェースを継承する際に、他の処理系が可能であると評価する当業者もいることだろう。
【0048】
本発明に関しては、好ましい態様を述べてきたが、本発明をその態様のみ限定する意図はない。本発明の精神に則った修正および変更は、当業者らによって明らかなものとなろう。本発明の適用範囲は添付の請求の範囲において定められる。
【0049】
【発明の効果】
以上説明したように、本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に、囲まれたオブジェクトを集合させ、囲まれたオブジェクトがオブジェクト管理インタフェースと外部インタフェースとを有し、囲んでいるオブジェクトが制御オブジェクト管理インタフェースを有し、集合したオブジェクトによってクライアントに提示されたインタフェースが、インタフェースの識別子を受取り識別したインタフェースに参照を戻すための質問メンバ関数を有し、囲んでいるオブジェクトのインスタンスを作成し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲んでいるオブジェクトによって提示されたインタフェースの識別子を受け取って提示されたインタフェースに対する参照を戻し、さらに、囲まれたオブジェクトのインスタンスを作成し、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、受け取った識別子を渡して囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの中から呼び出された質問メンバ関数によって戻される参照を識別されたインタフェースの参照として戻すので、複雑な手続きを取らず所望のコードを共用し、プログラム開発時のコストを低減させることができるという効果がある。
【図面の簡単な説明】
【図1】オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。
【図2】スプレッドオブジェクトのサンプルデータ構造を示すブロック図である。
【図3】本発明による集合オブジェクトを示すブロック図である。
【図4】本発明によるクラスS1のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。
【図5】本発明によるオブジェクトS3のデータ構造レイアウトを示すブロック図である。
【図6】本発明による別のオブジェクトに囲まれていないクラスS1のオブジェクトを示すブロック図である。
【図7】本発明によるクラスS1およびS2のオブジェクトを囲むクラスS3のオブジェクトを示す図である。
【符号の説明】
101 インスタンスデータ構造
102、202、205、206、402、403、403A、502、503、504 仮想関数表
103、104、105 メンバ関数
201 オブジェクトデータ構造
203 IBasicインタフェースデータ構造
204 IBasicインタフェースデータ構造
207、208、209、210、211、212、213、214、215、216、217、218、219、220、221 メソッド
222 形式
301 囲んでいるオブジェクトS3
302 囲まれたオブジェクトS2
303 囲まれたオブジェクトS1
304 処理系I3
401 インスタンス構造
404、405、406、406、408 関数
409、410、411、412 クラスCのメンバ関数
413、414、415、416 クラスDのメンバ関数
501 インスタンスデータ
505、506、507、508、509、510、511、512、513、514、515、516、517、603、604、605、606、613、615、617 メソッド
519 オブジェクトS2
601 クラスS1のオブジェクト
602 データメンバ関数
610 クラスS3のオブジェクト
612 データメンバ
619 データメンバ
Claims (21)
- CPU及びメモリを有するコンピュータシステムで実行される方法であって、CPUが、事前にメモリに記憶されたプログラムの命令に基づいて、囲んでいるオブジェクト内の囲まれたオブジェクトをメモリ内で集合させ、囲まれたオブジェクトは、オブジェクト管理インタフェースおよび外部インタフェースを有し、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有し、各インターフェースはインターフェースの識別子を受け取るための、及び参照を識別済のインターフェースに戻すための、質問メンバ関数を有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてCPUが、メモリ内に囲んでいるオブジェクトのインスタンスを生成し、そして、
メモリ内に事前に記憶されたプログラム命令に基づいてCPUが、メモリ内に囲まれたオブジェクトのインスタンスを生成し、その際、一旦、囲まれたオブジェクトが、囲んでいるオブジェクト内に集合されると、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が、CPUによる実行に基づいて囲まれたオブジェクトの外部インタフェースの識別子を受取り、外部インタフェースへ参照を戻し、その際に、一旦、囲まれたオブジェクトが、囲んでいるオブジェクト内に集合されると、囲まれたオブジェクトの外部インタフェースの質問メンバ関数が、CPUによる実行に基づいてインタフェースの識別子を受取り、該受け取られた識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を、識別済のインタフェースに対する参照として戻す、
ステップを含む方法。 - 前記囲まれたオブジェクトのインスタンスが集合オブジェクトであることを特徴とする請求項1記載の方法。
- 前記囲んでいるオブジェクトのインスタンスが集合可能なオブジェクトでないことを特徴とする請求項1記載の方法。
- メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてCPUが、前記囲まれたオブジェクトのインスタンスの外部インタフェースに関する特定の情報を有さないことを特徴とする請求項1記載の方法。
- メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてCPUが、前記囲まれたオブジェクトのインスタンスの外部インタフェースに関する特定の情報を有さないことを特徴とする請求項1記載の方法。
- メモリ内の前記囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてCPUが、囲まれたオブジェクトのインスタンスのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、該囲まれたオブジェクトのインスタンスの外部インタフェースに対する参照を検索することを特徴とする請求項1記載の方法。
- メモリ内の前記囲んでいるオブジェクトのインスタンス内にCPUが、囲まれたオブジェクトのインスタンスの外部インタフェースへの参照を記憶させ、メモリ内の囲んでいるオブジェクトのインスタンスの制御オブジェクト管理インタフェースの質問メンバ関数の命令の実行に基づいてCPUが、該格納された参照を囲まれているオブジェクトのインスタンスの外部インタフェースへの参照として戻すことを特徴とする請求項1記載の方法。
- CPU及びメモリを有するコンピュータシステムで実行される方法であって、CPUが、メモリ内に事前に記憶された集合可能なオブジェクトのクラス定義を実現する命令の実行に基づいてメモリ内で集合可能なオブジェクトを集合させ、
クラスはオブジェクト管理インタフェースおよび外部インタフェースを有し、該オブジェクト管理インタフェースと外部インタフェースは各インタフェースにアクセスするための質問メンバ関数を有し、当該方法が、
メモリ内に事前に記憶された作成インスタンスメンバ関数の命令を実行する時にCPUが、メモリ内でクラスのオブジェクトを具体化し、
オブジェクトを集合させない場合には、メモリ内に事前に記憶された作成インスタンスメンバ関数の命令の実行に基づいてCPUが、メモリ内のクラスの具体化されたオブジェクトのデータメンバ中に、メモリ内のクラスの具体化されたオブジェクトのオブジェクト管理インタフェースに対する参照を格納し、データを集合させる場合には、メモリ内のクラスの具体化されたオブジェクトのデータメンバ中に、囲んでいるオブジェクトの制御オブジェクト管理インタフェースに対する参照を格納し、
メモリ内のオブジェクト管理インタフェースの質問メンバ関数の命令を実行するときにCPUが、オブジェクトのインタフェースの識別子を受取り、参照を識別されたインタフェースに戻すステップと、
メモリ内の外部インタフェースの質問メンバ関数の命令を実行するときにCPUが、インターフェースの識別子を受取り、該インタフェースの識別子を渡すデータメンバによって参照を付せられたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、該呼び出された質問メンバ関数によって戻された参照を戻す、
ステップを含む方法。 - メモリに事前に記憶されたグローバル作成インスタンス関数の命令を実行する時にCPUが、メモリ内のクラスのオブジェクトを具体化するステップを含み、
メモリに事前に記憶されたグローバル作成インスタンス関数の命令の実行に基づいてCPUが作成インスタンスメンバ関数を呼び出してクラスを具体化してメモリ内にオブジェクトを生成し、メモリ内のクラスの作成されたインスタンスのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、メモリ内のクラスの作成されたインスタンスの外部インタフェースに対する参照を検索することによって、グローバル作成インスタンス関数が、メモリに事前に記憶されたクライアントの命令の実行に基づいてCPUによって呼び出し可能となり、クライアントの命令を実行する時にCPUがクラスのクラス定義に対するアクセスを必要とすることなく、クラスを具体化してオブジェクトを生成する、
請求項8記載の方法。 - CPU及びメモリを有するコンピュータシステム内で実行される方法であって、メモリ内に事前に記憶された命令に基づいてCPUがメモリ内で集合オブジェクトを作成し、集合オブジェクトは囲まれたオブジェクトを有し、囲まれたオブジェクトは集合オブジェクトによって提示される外部インタフェースを有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてメモリ内でCPUが集合オブジェクトを具体化し、集合オブジェクトの質問メンバ関数の命令に基づいてCPUが集合オブジェクトによって提示されたインタフェースに対する参照を検索するために集合オブジェクトがメモリ内に質問メンバ関数の命令を有して、
メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内で囲まれたオブジェクトを具体化し、囲まれたオブジェクトの質問メンバ関数の命令に基づいてCPUが集合オブジェクトによって提示されたインタフェースに対する参照を検索するために、囲まれたオブジェクトが外部インタフェースの質問メンバ関数の命令をメモリ内に有し、
囲まれたオブジェクトが集合オブジェクト内に集合されたときに、メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内に囲まれたオブジェクトに対する参照を格納し、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてCPUが囲まれたオブジェクトに対する格納された参照を使用し、提示された外部インタフェースに対する参照を検索し、そして、
囲まれたオブジェクトが集合オブジェクト内に集合されたときに、メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内に集合オブジェクトに対する参照を格納し、メモリ内の外部インタフェースの質問メンバ関数の命令の実行に基づいてCPUが集合オブジェクトに対する格納した参照を使用して、集合オブジェクトによって提示されたインタフェースに対する参照を検索する、
ステップを含む方法。 - 前記囲まれたオブジェクトに対する格納された参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてCPUが参照されたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する、
請求項10に記載の方法。 - 前記囲まれたオブジェクトに対する格納された参照が、囲まれたオブジェクトの外部インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてCPUが、提示された外部インタフェースに対する参照として外部インタフェースに対する参照を使用する
請求項10に記載の方法。 - メモリ内の前記外部インタフェースの質問メンバ関数の命令の実行に基づいてCPUが、格納された集合オブジェクトに対する参照を使用して、集合オブジェクトの質問メンバ関数を呼び出し、集合オブジェクトによって提示されたインタフェースに対する参照を検索する、
請求項10に記載の方法。 - 格納された前記囲まれたオブジェクトに対する参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、メモリ内の集合オブジェクトの質問メンバ関数の命令の実行に基づいてCPUが参照オブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する、
請求項13に記載の方法。 - メモリ内の前記外部インタフェースが加算参照と解放参照計数メンバ関数を有し、メモリ内の集合オブジェクトが加算参照と解放参照計数関数を有し、囲まれたオブジェクトの外部インタフェースの参照計数メンバ関数の命令の実行に基づいてCPUが集合オブジェクトの参照計数メンバ関数を呼び出す、請求項10に記載の方法。
- CPUとメモリを有するコンピュータシステムで実行される方法であって、メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内の囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索するためのものであり、囲まれたオブジェクトが囲んでいるオブジェクトによって提示された外部インタフェースを有し、当該方法が、
メモリに事前に記憶されたプログラム命令に基づいてCPUがメモリ内に、囲んでいるオブジェクトを具体化し、
メモリに事前に記憶されたプログラム命令に基づいてCPUがメモリ内に、囲まれたオブジェクトを具体化し、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、メモリに事前に記憶されたプログラム命令に基づいてCPUが囲まれたオブジェクトに対する参照を、メモリ内の囲んでいるオブジェクト内に格納し、そして、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、そして、メモリ内の囲んでいるオブジェクトの質問メンバ関数の命令を実行するときに、CPUが囲まれたオブジェクトの質問メンバ関数を呼び出し、囲まれたオブジェクトに対する格納された参照を利用して囲まれたオブジェクトの提示された外部インタフェースに対する参照を検索する、
ステップを含む方法。 - CPUが、囲んでいるオブジェクトの提示されたインタフェースに対する複数の参照を反映する、メモリ内の当該囲んでいるオブジェクト内に参照カウントを維持するステップを有する請求項16に記載の方法。
- CPUとメモリを有するコンピュータシステムで実行される方法であって、メモリ内に事前に記憶されたプログラム命令に基づいてCPUが囲まれたオブジェクトを、メモリ内の囲んでいるオブジェクト内に囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、質問メンバ関数が囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索するためのものであり、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有し、当該方法が、
メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内の囲んでいるオブジェクトを具体化し、
メモリ内に事前に記憶されたプログラム命令に基づいてCPUがメモリ内の囲まれたオブジェクトを具体化し、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、メモリ内に事前に記憶されたプログラム命令に基づいてCPUが囲んでいるオブジェクトに対する参照をメモリ内の囲まれたオブジェクト内に格納し、そして、
囲まれたオブジェクトが囲んでいるオブジェクト内に囲まれるときに、そして、メモリ内の囲まれたオブジェクトの質問メンバ関数を実行するときに、CPUが、囲んでいるオブジェクトの質問メンバ関数を呼び出し、格納された囲んでいるオブジェクトに対する参照を利用して囲んでいるオブジェクトの提示されたインタフェースに対する参照を検索する、
ステップを含む方法。 - メモリ内に事前に記憶されたプログラム命令に基づいてCPUが、メモリ内の囲んでいるオブジェクト内に、囲んでいるオブジェクトの提示されたインタフェースに対する複数の参照を反映する参照カウントを維持するステップを有する請求項18に記載の方法。
- 囲まれたオブジェクトの質問メンバ関数が、メモリ内で囲まれたオブジェクトの外部インタフェースに対応させられ、囲まれたオブジェクトが質問メンバ関数を備えたオブジェクト管理インタフェースを有し、メモリ内の囲んでいるオブジェクトの質問メンバ関数の命令の実行に応じてCPUが囲まれたオブジェクトのオブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲まれたオブジェクトの外部インタフェースに対する参照を検索する、請求項18に記載の方法。
- その中に記憶された集合可能なソフトウェアオブジェクトを有するメモリであって、当該オブジェクトが、
オブジェクト管理インタフェースであって、当該オブジェクト管理インタフェースが、オブジェクトのインタフェースの識別子を受取り、インタフェースに対する参照を戻すための命令を備えた質問メンバ関数を有するオブジェクト管理インタフェースと、
外部インタフェースであって、当該外部インタフェースが、インタフェースの識別子を受取り、オブジェクトが集合されていない場合にはオブジェクト管理インタフェースの質問メンバ関数を呼び出し、オブジェクトが集合されている場合には囲んでいるオブジェクトの質問メンバ関数を呼び出し、識別されたインタフェースに対する参照を戻すための命令を備えた質問メンバ関数を有する、外部インタフェース、
を有するメモリ及び、
メモリ内で命令を実行するためのCPU、
を備えるコンピュータシステム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US99655292A | 1992-12-24 | 1992-12-24 | |
US07/996552 | 1992-12-24 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002142748A Division JP4084956B2 (ja) | 1992-12-24 | 2002-05-17 | オブジェクト集合方法およびシステム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH06282433A JPH06282433A (ja) | 1994-10-07 |
JP3672334B2 true JP3672334B2 (ja) | 2005-07-20 |
Family
ID=25543042
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP32811493A Expired - Lifetime JP3672334B2 (ja) | 1992-12-24 | 1993-12-24 | オブジェクト集合方法およびシステム |
JP2002142748A Expired - Lifetime JP4084956B2 (ja) | 1992-12-24 | 2002-05-17 | オブジェクト集合方法およびシステム |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002142748A Expired - Lifetime JP4084956B2 (ja) | 1992-12-24 | 2002-05-17 | オブジェクト集合方法およびシステム |
Country Status (5)
Country | Link |
---|---|
EP (1) | EP0603880B1 (ja) |
JP (2) | JP3672334B2 (ja) |
AT (1) | ATE193132T1 (ja) |
CA (1) | CA2113417C (ja) |
DE (1) | DE69328664T2 (ja) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5805885A (en) | 1992-12-24 | 1998-09-08 | Microsoft Corporation | Method and system for aggregating objects |
CA2213674A1 (en) * | 1995-03-20 | 1996-09-26 | Terrence T. Yee | Operating system runtime supporting release-to-release binary compatibility |
JPH08297573A (ja) * | 1995-04-27 | 1996-11-12 | Fujitsu Ltd | オブジェクトデータ処理装置 |
EP0841612A3 (en) * | 1996-11-08 | 2003-05-28 | International Business Machines Corporation | Framework for software development |
US6125364A (en) * | 1997-11-06 | 2000-09-26 | International Business Machines Corporation | Flexible object persistence framework using data cursor objects loaded from superclasses |
US6487551B2 (en) | 1998-09-24 | 2002-11-26 | International Business Machines Corporation | Externalizing very large objects in a relational database client/server environment |
US6564368B1 (en) * | 1998-10-01 | 2003-05-13 | Call Center Technology, Inc. | System and method for visual application development without programming |
US6397384B1 (en) * | 1998-12-18 | 2002-05-28 | Adobe Systems Incorporated | Run-time addition of interfaces |
US6877163B1 (en) * | 1999-06-14 | 2005-04-05 | Sun Microsystems, Inc. | Method and system for dynamic proxy classes |
US8108831B2 (en) * | 2008-02-07 | 2012-01-31 | Microsoft Corporation | Iterative component binding |
JP2009271770A (ja) * | 2008-05-08 | 2009-11-19 | Sumitomo Heavy Ind Ltd | プログラミング装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
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 |
-
1993
- 1993-12-17 CA CA002113417A patent/CA2113417C/en not_active Expired - Lifetime
- 1993-12-23 EP EP93120785A patent/EP0603880B1/en not_active Expired - Lifetime
- 1993-12-23 AT AT93120785T patent/ATE193132T1/de not_active IP Right Cessation
- 1993-12-23 DE DE69328664T patent/DE69328664T2/de not_active Expired - Lifetime
- 1993-12-24 JP JP32811493A patent/JP3672334B2/ja not_active Expired - Lifetime
-
2002
- 2002-05-17 JP JP2002142748A patent/JP4084956B2/ja not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
DE69328664D1 (de) | 2000-06-21 |
CA2113417C (en) | 2000-02-22 |
CA2113417A1 (en) | 1994-06-25 |
EP0603880A2 (en) | 1994-06-29 |
EP0603880A3 (en) | 1995-08-16 |
JP4084956B2 (ja) | 2008-04-30 |
DE69328664T2 (de) | 2000-08-31 |
JP2003022186A (ja) | 2003-01-24 |
EP0603880B1 (en) | 2000-05-17 |
JPH06282433A (ja) | 1994-10-07 |
ATE193132T1 (de) | 2000-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3822541B2 (ja) | オブジェクトインターフェイスにポインタをパスするためのコンピュータシステム | |
US7225426B2 (en) | Dynamic objects with property slot definition and runtime mechanisms | |
JP4322967B2 (ja) | オブジェクト集合方法及びシステム | |
US7225438B2 (en) | Lazy compilation of template-generated classes in dynamic compilation execution environments | |
US7219329B2 (en) | Systems and methods providing lightweight runtime code generation | |
US5752034A (en) | Apparatus and method for providing an event detection notification service via an in-line wrapper sentry for a programming language | |
KR970008530B1 (ko) | 언어 특정의 인터페이스 정의 발생 시스템 및 언어 중립 객체 정의에 기초한 실행가능한 코드 발생 방법 | |
US5418964A (en) | System and method for parent class shadowing in a statically linked object hierarchy | |
US5896532A (en) | Objects with run-time classes and methods of making them | |
US5590327A (en) | Method for making data objects having hidden pointers persistent | |
JPH10511202A (ja) | オブジェクト指向環境における回復可能プロキシ・オブジェクト | |
US6209040B1 (en) | Method and system for interfacing to a type library | |
US5603030A (en) | Method and system for destruction of objects using multiple destructor functions in an object-oriented computer system | |
JP3672334B2 (ja) | オブジェクト集合方法およびシステム | |
US5062039A (en) | Sharing of workspaces in interactive processing using workspace name tables for linking of workspaces | |
JP3844801B2 (ja) | インターフェース継承を伴うオブジェクト上での呼出しのための方法および機構 | |
US6782532B1 (en) | Object type system for a run-time environment using generated high-order language instructions for generic functions | |
Pautet et al. | CORBA & DSA: Divorce or marriage? | |
Hamilton | Interlanguage Object Sharing with SOM. | |
Tatsubori | A Class-Object Model for Program Transformations | |
Hamilton | Conference on Object-Oriented Technologies (COOTS) Toronto, Ontario, Canada, June 1996. | |
Squyres et al. | Object Oriented MPI (OOMPI): A C++ Class Library for MPI Version 1.0. 3 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20020624 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20041005 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20041012 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050104 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20050419 |
|
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: 20090428 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090428 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100428 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110428 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120428 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120428 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130428 Year of fee payment: 8 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140428 Year of fee payment: 9 |
|
EXPY | Cancellation because of completion of term |