JPH0836493A - オブジェクト集合方法及びシステム - Google Patents
オブジェクト集合方法及びシステムInfo
- Publication number
- JPH0836493A JPH0836493A JP7008308A JP830895A JPH0836493A JP H0836493 A JPH0836493 A JP H0836493A JP 7008308 A JP7008308 A JP 7008308A JP 830895 A JP830895 A JP 830895A JP H0836493 A JPH0836493 A JP H0836493A
- Authority
- JP
- Japan
- Prior art keywords
- interface
- enclosing
- enclosed
- iunknown
- class
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
を集合する方法及びシステムを提供する。 【構成】 オブジェクトを集合する方法は、囲まれたオ
ブジェクトを、囲んでいるオブジェクト内に集合する。
囲まれたオブジェクトは、オブジェクト管理インターフ
ェイス及び外部インターフェイスを有し、囲んでいるオ
ブジェクトは制御オブジェクト管理インターフェイスを
有する。囲まれたオブジェクトの制御オブジェクト管理
インターフェイス及び外部インターフェイスは、インタ
ーフェイスの識別子を受け取ってその識別されたインタ
ーフェイスの参照を返送する問合せ関数メンバを有す
る。囲んでいるオブジェクト及び囲まれるべきオブジェ
クトのインスタンスが形成される。静的な集合では、囲
んでいるオブジェクトの制御オブジェクト管理インター
フェイスが、囲まれたオブジェクトの外部インターフェ
イスへ識別子をいかに返送するかを前もって知る。動的
な集合では、囲んでいるオブジェクトが具体化された後
に、囲まれるべきオブジェクトが囲んでいるオブジェク
トに追加される。
Description
り上げる1992年12月24日出願の「オブジェクト
の集合方法及びシステム(A Method and System for Agg
regating Objects) 」と題する米国特許出願第07/9
96,552号の一部継続出願である。
においてオブジェクトに対してインターフェイスを実行
する方法及びシステムに係、より詳細には、オブジェク
トを集合させる方法及びシステムに係る。
雑になるにつれ、ソフトウェアを開発するためのコスト
も増加している。ソフトウェア開発コストを最小限にす
るために、開発者は、コードを共用することが多い。従
来の開発技術では、3つのタイプのコード共用を使用し
ている。すなわち、(1)ソースコードの共用、(2)
コンパイル済コードの共用、(3)継承によるコード共
用、である。
複雑になるにつれ、ソフトウェアのユーザは、コンピュ
ータシステムの保守及び拡張が益々複雑になることに直
面している。ソフトウェアの販売者が新たな又は改良し
た能力を形成するたびに、その特典を得ようとするユー
ザは、それらの変更をともかく組み込まねばならない。
公知のシステムは、一般に、このようなユーザがソフト
ウェアをグレードアップする必要があり、ユーザは、シ
ステムの少なくとも一部分を再設置することを余儀なく
される。或いは、公知システムは、ソフトウェアの開発
者が将来の増強を前もって計画し、そしてオリジナルの
システムに必要なフックを設置して、将来に増強手段を
装填できるようにする必要がある。
者によって発売された能力を付加することにより現在所
有しているソフトウェアの一部分の能力を増強しようと
する場合には、ソフトウェア販売者が前もって計画して
いるものによりユーザに制限が課せられる。公知のシス
テムは、一般に、ソフトウェアの2つの部片が一緒に機
能するように設計されると共に、これらソフトウェア部
片の少なくとも一方がその他方により与えられる能力を
知ることが必要とされる。従って、公知のシステムで
は、コードに対するその後の変更及びコードの共用を、
ソフトウェア設計に考慮しておかねばならない。
共用する方法は、長年広く使用されてきた。ソースコー
ドの共用とは、さまざまなコンピュータプログラム又は
同一のコンピュータプログラムのさまざまなバージョン
で同一のコードを使用することである。例えば、一般に
スプレッドシートプログラムは、スップレッドシート表
示を制御するソースコードを含む。ワードプロセッシン
グプログラムでスプレッドシートを文書内に埋め込むこ
とができれば、そのワードプロセッシングプログラムは
同一の(又はわずかに修正した)ソースコードを使用し
て、埋め込んだスプレッドシートオブジェクトを表示す
ることができる。ソースコードは、一般に単独の開発者
が複数のコンピュータプログラムを開発する際に共用さ
れる。他者と競争する関係上、開発者は他の開発者とコ
ードを共用しない。さらに、コードを共用する場合でさ
え、ソースコード受信者はソースコードを修正するのが
一般的であり、この結果、ソースコードに対し2つのバ
ージョンが維持されることになる。
なコンピュータプログラムで同一のコンパイル済コード
を使用することである。一般に、コンパイル済コードは
静的リンクライブラリまたは動的リンクライブラリに格
納される。静的リンクライブラリに格納されたコード
は、実行前にコンピュータプログラムを連係した場合に
共用される。例えば、スペルチェックプログラムの開発
者は、そのプログラムをコンパイルして静的リンクライ
ブラリにコンパイル済コードを格納することによってコ
ンパイル済コードを共用できる。その後、静的リンクラ
イブラリをワードプロセッシングプログラム開発者に配
布することによって、これらの開発者はコンパイル済ス
ペルチェックコードをそれぞれのワードプロセッシング
プログラムに連係することができる。一般に、スペルチ
ェックプログラム開発者は、コンパイル済コード修正し
て、特定開発者の特殊な要求に応じなければならない。
こうした修正によって、コンパイル済コードの複雑化
(とサイズの増大)を助長するだけでなく、他の受信者
の要求と矛盾する可能性もある。他に、開発者が、静的
リンクライブラリの複数のバージョンを分散することも
考えられる。しかし複数のバージョンを保守するにはコ
ストがかかりかねない。
は、コードを共用できるようにする継承と称する概念を
使用している。本発明は、オブジェクト指向のプログラ
ミングを用いて以下に説明するので、良く知られたオブ
ジェクト指向のプログラミング技術を要約する。オブジ
ェクト指向プログラミング言語では、データのカプセル
化とデータタイプの継承を支援するという2つの特徴が
一般に知られている。データのカプセル化とは、関数と
データを結合させることである。継承は、あるデータタ
イプを別のデータタイプに関して宣言する能力を指す。
クラスを使用して支援される。クラスは、ユーザが定義
したタイプである。クラスの宣言によって、クラスのデ
ータメンバとメンバ関数が定義される。例えば、下記の
宣言はCIRCLEというクラスのデータメンバとメンバ関数
とを定義する。 変数xおよびyは、円の中心座標を指定し、変数radius
はその円の半径を指定する。これらの変数をクラスCIRC
LEのデータメンバという。関数drawは、ユーザが定義し
た関数で、指定座標から指定した半径で円を描く。この
関数drawをクラスCIRCLEの関数メンバという。あるクラ
スのデータメンバと関数メンバは、関数がクラスのイン
スタンスで動作するという点で一緒に結合される。クラ
スのインスタンスは、クラスのオブジェクトとも呼ばれ
る。
は、オブジェクト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の特徴を継承する。 この宣言は、クラスCIRCLE FILLが、クラスCIRCLE FI
LLの宣言時に導入したデータメンバ及び関数メンバ、即
ちデータメンバ pattern及び関数メンバfillに加えて、
クラスCIRCLEに存在する全てのデータメンバ及び関数メ
ンバを含むことを指定する。この例では、クラスCIRCLE
FILLは、データメンバx、y、radius、及びpattern
と、関数メンバdraw及びfillとを有している。クラスCI
RCLE FILLは、クラスCIRCLEの特徴を「継承する」と言
える。他のクラスの特徴を継承するクラスは、導出クラ
ス(CIRCLE FILLなど)である。他のクラスの特徴を継
承しないクラスを一次クラス(ルートクラス)という
(CIRCLEなど)。他クラスによって特徴が継承されるク
ラスは、基本クラスである(例えば、CIRCLEは、CIRCLE
FILLの基本クラスである)。導出クラスは、複数のクラ
ス特徴を継承することができる。つまり、導出クラスは
複数の基本クラスを有することができる。これを多重継
承という。
されることを指定してもよい。基本クラスの仮想継承と
は、仮想基本クラスのインスタンスが導出クラス中の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つ存在するのである。
出クラスの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度仮想的に継承されるので、導出クラスPA
TTERN には、クラスCIRCLEのオブジェクトが1つしか存
在しないことになる。クラス導出が複雑な場合に、仮想
継承が非常に有益であることが当業者に明らかであろ
う。
かどうかも指定できる。ある関数メンバが仮想的である
と宣言することは、その関数が導出クラスにおいて同一
名及び同一タイプの関数によってオーバーライドできる
ことを意味する。下記の例では、関数drawをクラスCIRC
LEとCIRCLE FILLで仮想的であると宣言している。 仮想関数が、実現を与えずに宣言される場合には、純粋
な仮想関数と称される。純粋な仮想関数は、純粋な指定
子"=0"で宣言された仮想関数である。あるクラスが純粋
な仮想関数を指定する場合には、いかなる導出クラス
も、その関数メンバが呼び出される前に、その関数メン
バに対する実現を指定する必要がある。
+言語は、ポインタデータタイプを与える。ポインタ
は、メモリ中のオブジェクトのアドレスである値を保持
する。ポインタにより、オブジェクトに参照することが
できる。下記のステートメントは、変数 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である。
般的なデータ構造を示すブロック図である。オブジェク
トはインスタンスデータ(データメンバ)およびメンバ
関数であり、オブジェクトを実際に動作させる。オブジ
ェクトの表現に使用するデータ構造は、インスタンスデ
ータ構造101と、仮想関数表102と、関数メンバ1
03、104及び105から成る。インスタンスデータ
構造101は、仮想関数表102に対するポインタとデ
ータメンバを含む。仮想関数表102は、オブジェクト
に対して定義した各仮想関数メンバのエントリを含む。
各エントリは、対応する関数メンバを実行するコードの
参照を含む。このサンプルオブジェクトのレイアウト
は、参考としてここに取り上げる米国特許出願第07/68
2,537 号「A Methodfor Implementing Virtual Functio
n and Virtual Bases in a Compiler for an Object Or
iented Programming Language 」に適合する。以下の説
明において、オブジェクトを、C++プログラミング言
語で定義したクラスのインスタンスとして述べる。当業
者は、オブジェクトは他のプログラミング言語を使用し
て定義できることが明らかであろう。
る。クラス開発者は、他の開発者にクラスの実現体を提
供することができる。この他の開発者は、提供されたク
ラスから導出するクラスを作成することができる。ただ
し、クラスが継承されて、仮想関数がオーバーライドさ
れる場合は、オーバーライド仮想関数のテストは複雑に
なることが考えられる。オーバーライド仮想関数は、非
オーバーライド関数に影響を与えるようにオブジェクト
の状態を修正することができる。このため、各継承関数
は、オーバーライド仮想関数のテストに関連して独立し
たテストをする必要がある。テストの複雑さを改善する
には、クラスの実現体の開発者は、その実現体をもつソ
ースコードを分配することができる。不幸にも、ソース
コードの分配は、上述のように、共用ソースコードに同
様の支障が生じる。
クトの共用を容易にできることである。特に、オブジェ
クト指向技術は複合文書の作成を容易にする。複合文書
は、さまざまなコンピュータプログラムによって生成さ
れたオブジェクトを含む文書である。(一般に、オブジ
ェクトのデータメンバとクラスタイプのみが複合文書に
格納される。)例えば、スプレッドシートプログラムで
生成したスプレッドシートオブジェクトを含むワードプ
ロセッシング文書は、複合文書である。ワードプロセッ
シングプログラムでは、ユーザは(セルなど)スプレッ
ドシートをワードプロセッシング文書内に埋め込むこと
ができる。この埋め込みは、ワードプロセッシングプロ
グラムを、埋め込むべきオブジェクトのクラス定義を使
用して埋め込んだオブジェクトの関数メンバにアクセス
して、コンパイルすることによって可能となる。このた
め、ワードプロセッシングプログラムは、ワードプロセ
ッシング文書に埋め込むことができるオブジェクトの各
クラスのクラス定義を使用してコンパイルしなければな
らない。新しいクラスのオブジェクトをワードプロセッ
シング文書に埋め込むには、ワードプロセッシングプロ
グラムは新たなクラス定義でリコンパイルしなければな
らないと考えられる。このため、ワードプロセッシング
プログラムの開発者が選択したクラスオブジェクトだけ
を埋め込むことができる。さらに、新たなクラスをワー
ドプロセッシングプログラムを新たにリリースしてのみ
支援することができる。
め込むには、ワードプロセッシングプログラムがコンパ
イル時間にクラス定義にアクセスする必要なしにオブジ
ェクトをアクセスできるようにインタフェースを定義す
る。抽象クラスは、実現部をもたない仮想関数メンバ
(純粋な仮想関数メンバ)が少なくとも1つは存在する
クラスである。インタフェースは、データメンバがない
抽象クラスであり、その仮想関数はすべて純粋である。
従って、インターフェイスは、2つのプログラムがコミ
ニケーションすべきプロトコルを与える。インターフェ
イスは、一般に、導出に対して使用され、プログラム
は、クラスが導出されるインターフェイスに対して実現
部を与えるようなクラスを実現する。その後に、これら
導出されたクラスのインスタンスとしてオブジェクトが
形成される。
義の一例である。この例では、説明を簡略にするため
に、オブジェクトのクラスを文書に埋め込めるようにす
るのではなく、ワードプロセッシングプログラムは、ス
プレッドシートオブジェクトを埋め込めるようにする。
オブジェクトがどのように実現されるかに係わりなく、
このインタフェースを与えるスプレッドシートオブジェ
クトを埋め込むことができる。更に、スプレッドシート
オブジェクトは、ワードプロセッシングプログラムをコ
ンパイルする前に実現されるかその後に実現されるかに
係わりなく、埋め込むことができる。 class ISpreadSheet { virtual void File() =0; virtual void Edit() =0; virtual void Formula() =0; virtual void Format() =0; virtual void GetCell (string RC, cell*pCell) = 0; virtual void Data() = 0; } スプヘレッドシートプログラムの開発者は、スプレッド
シートオブジェクトをワードプロセッシング文書に埋め
込むことができるように、インタフェースの実現を与え
る必要がある。
ッドシートオブジェクトを埋め込むときは、そのプログ
ラムは、スプレッドシートオブジェクトに対するインタ
フェースを実現するコードにアクセスしなければならな
い。そのクラスコードにアクセスするために、各実現部
には独特のクラス識別子が与えられる。例えば、マイク
トソフト社が開発したスプレッドシートオブジェクト
は、「MSSpreadsheet 」というクラス識別子を有する
が、他社開発のスプレッドシートオブジェクトを実施す
るコードは、「LTSSpreadsheet」というクラス識別子を
有する。各コンピュータシステムには永続登録が維持さ
れ、これは、各クラス識別子を、クラスを実現するコー
ドにマップする。一般に、スプレッドシートプログラム
がコンピュータシステムにインストールされると、永続
登録は、スプレッドシートオブジェクトのクラスの利用
性を反映するように更新される。スプレッドシート開発
者が、インタフェースによって定義された各関数メンバ
を実現しそして永続登録が維持される限り、ワードプロ
セッシングプログラムは、開発者のスプレッドシートオ
ブジェクトのインスタンスをワードプロセッシング文書
に埋め込むことができる。ワードプロセッシングプログ
ラムは、その埋め込まれたスプレッドシートオブジェク
トの関数メンバを、誰がそれを実現したか又はそれらが
どのように実現されたかに係わりなく、アクセスする。
は、ある関数メンバのみを実現したいであろう。例え
ば、あるスプレッドシート開発者は、データベース支援
は実現したくないが、他の全ての関数メンバは支援した
いであろう。オブジェクトを埋め込むことができる上
に、スプレッドシートの開発者が関数メンバの一部のみ
を支援できるようにするため、スプレッドシートオブジ
ェクトに対して多数のインタフェースが定義される。例
えば、インタフェースIDatabase 及びIBasicは、下記の
ようにスプレッドシートに対して定義できる。 class IBasic { virtual void File() =0; virtual void Edit() =0; virtual void Formula() =0; virtual void Format() =0; virtual void GetCell (String RC, cell*pCell) = 0 } class IDatabase { virtual void Data() =0; } 各スプレッドシート開発者は、IBasicインタフェースを
実現し、IDatabase インターフェイスを任意に実行す
る。
ムは、埋め込まれるべきスプレッドシートオブジェクト
がIDatabase インタフェースを支援するかどうかを決定
しなければならない。この決定をするために、どのイン
タフェースがオブジェクトに対して実現されるかを指示
する関数メンバと共に別のインタフェース(各スプレッ
ドシートオブジェクトが実現する)が定義される。この
インタフェースは、IUnknownという名称であり(そして
未知のインタフェース又はオブジェクト管理インタフェ
ースと称され)、下記のように定義される。 class IUnknown { virtual HRESULT QueryInterface(REFIID iid, void**ppv) = 0; virtual ULONG AddRef() = 0; virtual ULONG Release() = 0; } このIUnknownインタフェースは、関数メンバ(メソッ
ド)QueryInterfaceを定義する。メソッドQueryInterfa
ceには、(タイプREFIIDの)パラメータiid においてイ
ンタフェース識別子(例えば、IDatabase )が通され、
そしてこのメソッドがパラメータppv において呼び出さ
れるオブジェクトに対し識別されたインタフェースの実
現を指すポインタを返送する。このオブジェクトがイン
タフェースを支援しなければ、このメソッドは偽を返送
する。タイプHRESULT は、予め定義された状態を指示
し、タイプREFIIDは、インターフェイス識別子に対する
参照を指示し、そしてタイプULONG は、非サインの長い
整数を指示する。 コード表1 HRESULTXX::Queryinterface(REFIID iid, void**ppv) { ret = TRUE; switch (iid){ case IID IBasic: *ppv = *pIBasic; break; case IID IDatabase : *ppv = pIDatabase; break; case IID IUnknown: *ppv = this; break; default: ret = FALSE; } if (ret==TRUE){AddRef(); }; return ret; }
ドQueryInterfaceを一般的に実現するC++擬似コード
を含み、これは、クラスIUnknownを継承する。スプレッ
ドシートオブジェクトがIDatabase インタフェースを支
援する場合、メソッドQueryInterfaceはswitchステート
メント内に適切なcaseラベルを含む。変数pIBasic とpI
Databaseは、各々、IBasicインタフェースとIDatabase
インタフェースの仮想関数表に対するポインタを指す。
メソッドQueryInterfaceは、インタフェースのポインタ
が返送されるときにクラスXXのオブジェクトに対する
参照カウント値をインクリメントするためにメソッドAd
dRef(以下に述べる) を呼び出す。 コード表2 void XX::AddRef() {refcount++ ;} void XX::Release(){if(--refcount==0)delete this ;}
ef及びRelease も定義し、これらは参照カウントの実行
に使用される。インタフェースに対する新たな参照が形
成されるときに、メソッドAddRefを呼び出し、オブジェ
クトの参照カウントをインクリメントする。参照がもは
や必要なくなると、メソッドRelease を呼び出し、オブ
ジェクトの参照カウントをディクリメントし、参照カウ
ントが0になったときに、オブジェクトの割当てを解除
する。コード表2は、クラスXXに対するメソッドAddR
ef及びRelease を一般的に実現するC++擬似コードを
含み、これは、クラスIUnknownを継承する。
フェースはIUnknownインタフェースを継承する。下記の
定義は、IUnknownインタフェースの使用法を示す。 class IDatabase:public IUnknown { publicl: virtual void Data() = 0; } class IBasic:public IUnknown { public: virtual void File() = 0; virtual void Edit() = 0; virtual void Formula() = 0; virtual void Fromat() = 0; virtual void GetCell(stning RC, cell*pCell) = 0; }
ドオブジェクトのデータ構造例を示すブロック図であ
る。このスプレッドオブジェクトは、オブジェクトデー
タ構造201と、IBasicインタフェイスデータ構造20
3と、IDatabase インターフェイスデータ構造204
と、仮想関数表202、205及び206と、メソッド
207ないし221とを含む。オブジェクトデータ構造
201は、仮想関数表202に対するポインタと、IBas
ic及びIDatabase インタフェイスに対するポインタとを
含む。仮想関数表202の各エントリは、IUnknownイン
タフェイスのメソッドに対するポインタを含む。IBasic
インタフェイスデータ構造203は、仮想関数表205
に対するポインタを含む。仮想関数表205の各エント
リは、IBasicインタフェイスのメソッドに対するポイン
タを含む。IDatabase インタフェース構造204は、仮
想関数表206に対するポインタを含む。仮想関数表2
07の各エントリは、IDatabase インタフェースのメソ
ッドのポインタを含む。IBasic及びIDatabase インタフ
ェースは、IUnknownインタフェースを継承するので、仮
想関数表205及び206は、メソッドQueryInterfac
e、AddRef及びRelease に対するポインタを各々含む。
以下、オブジェクトデータ構造は、オブジェクトをアク
セスすることのできるインタフェースでラベル付けした
形式222により表わされる。
ブジェクトがIDatabase インタフェースを支援するかど
うかをワードプロセッシングプログラムがいかに決定す
るかを示す。 if(pSpreadsheet->QueryInterface("IDatabse",& pIDatabase)) // IDatabase Supported else // IDatabase not Supported ポインタ pSpreadsheet は、図2に示すスプレッドシー
トクラスのインスタンスに対するポインタである。(pS
preadsheetは、データ構造210を指す。)このオブジ
ェクトがIDatabase インタフェースを支援する場合は、
メソッド207により定義されたメソッドQueryInterfa
ceは、IDatabase データ構造204を指すようにポイン
タpIDatabaseをセットし、その値として真を返送する。
「新たな」演算子によって具体化することができる(メ
モリ内に作成したオブジェクトのインスタンス)。しか
し、どちらの具体化技術も、コンパイル時にクラス定義
を必要とする。ワードプロセッシングプログラムが実行
時にスプレッドシートオブジェクトを具体化できるため
には別の技術が必要とされる。その1つの技術は、グロ
ーバルな関数CreateInstanceXXを与え、これは、次のよ
うに定義される。 static void CreateInstanceXX(REFIID iid, void**ppv) = 0 ; メソッドCreateInstanceXXは、クラスXXのオブジェク
トを実現化し、ポインタppv をパラメータiid により定
義されたオブジェクトのインタフェースへ戻す。
ジェクトを集合する方法及びシステムを提供することで
ある。
を動的に変更する方法及びシステムを提供することであ
る。
動的に集合する方法及びシステムを提供することであ
る。
静的に集合する方法及びシステムを提供することであ
る。
別のオブジェクト内に囲う一方、その囲まれたオブジェ
クトのインターフェイスをその囲んでいるオブジェクト
のクライエントへ提示する方法及びシステムを提供する
ことである。
ジェクトが具体化された後にオブジェクトを別のオブジ
ェクト内に囲む方法及びシステムを提供することであ
る。
オブジェクトを単一のオブジェクトへと動的に組み合わ
せる方法及びシステムを提供することである。
実現を変更せずに別のオブジェクト内に囲むことができ
るか又は別のオブジェクト内に囲まれないようなオブジ
ェクトを実現する方法及びシステムを提供することであ
る。
集合であることをクライエントが分からないような集合
オブジェクトを実現する方法及びシステムを提供するこ
とである。
ェクトそれ自体が任意の囲い込みレベルに対して囲んで
いるオブジェクトとなり得るようなオブジェクトを囲い
込む方法及びシステムを提供することである。
フェイスを追加することによりベースオブジェクトの動
作を増強する方法及びシステムを提供することである。
クトの標準的な動作をオーバーライドするインターフェ
イスを追加することによりベースオブジェクトの見掛け
上の動作を増強する方法及びシステムを提供することで
ある。
んでいるオブジェクトがデフォールト機能を実現するよ
うに、囲んでいるオブジェクト内にオブジェクトを囲む
ことにより、オブジェクトにデフォールト機能を与える
方法及びシステムを提供することである。
ェクト内に存在する共通の機能に対して制御動作を実現
する方法及びシステムを提供することである。そして本
発明の更に別の目的は、2つ以上の囲まれたオブジェク
トによって実施されるインターフェイスをクライエント
が要求するときにクライエントにどのインターフェイス
を与えるかを決定する方法及びシステムを提供すること
である。
の以下の説明において明らかとなる他の目的は、コンピ
ュータシステム内にオブジェクトを集合させる方法及び
システムによって達成される。好ましい実施例では、本
発明の方法は、囲まれたオブジェクトを、囲んでいるオ
ブジェクト内に集合させる。この囲まれたオブジェクト
は、オブジェクト管理インタフェース及び1つ以上の外
部インタフェースを有し、一方、囲んでいるオブジェク
トは、制御オブジェクト管理インタフェースを有する。
集合オブジェクトによってクライアントに提示される各
インタフェースは、インターフェイスの識別子を受け取
ってその識別されたインターフェイスに対する参照を返
送する問合せ関数メンバを有する。囲んでいるオブジェ
クトの制御オブジェクト管理インタフェースの問合せ関
数メンバは、囲んでいるオブジェクトによって提示され
たインタフェースの識別子を受取り、その提示されたイ
ンタフェースに対する参照を返送する。本発明の好まし
い方法では、囲まれたオブジェクトのインスタンスを作
成する。囲まれたオブジェクトの提示されたインタフェ
ースの問合せ関数メンバは、インタフェースの識別子を
受け取ると、その受け取った識別子を通すように上記囲
んでいるオブジェクトの制御オブジェクト管理インタフ
ェースの問合せ関数メンバを呼び出し、そして上記囲ん
でいるオブジェクトの制御オブジェクト管理インタフェ
ースの呼び出された問合せ関数メンバによって戻される
参照を、識別されたインタフェースの参照として返送す
る。
たオブジェクトの問合せ関数メンバは、囲まれたオブジ
ェクトの外部インターフェイスの知識で実現され、囲ん
でいるオブジェクト又は他の囲まれたオブジェクトのイ
ンターフェイス(制御オブジェクト管理インターフェイ
ス以外の)の知識をもたない。囲んでいるオブジェクト
の制御オブジェクト管理インターフェイスの問合せ関数
メンバは、囲まれたオブジェクトの提示されたインター
フェイスの知識で実現される。
ェクトによって実現されるインターフェイスインターフ
ェイスをクライエントプログラムの実行中に集合できる
ようにすることによりオブジェクトを動的に変更するこ
とができる。インターフェイスは、それらを実現するオ
ブジェクトをマルチタイプオブジェクトへと動的に囲い
込むことにより集合される。追加されるべき各インター
フェイスは、集合される能力をもつオブジェクトによっ
て実現される。マルチタイプオブジェクトは、囲んでい
るオブジェクトとして働くように形成される。マルチタ
イプオブジェクトは、追加インターフェイス関数メンバ
を有し、これは、囲んでいるマルチタイプオブジェクト
にインターフェイスを追加することによりインターフェ
イスを集合するように使用できる。又、マルチタイプオ
ブジェクトは、オブジェクトの全てのインターフェイス
を集合するための追加オブジェクト関数も有する。又、
マルチタイプオブジェクトは、クライエントから要求が
あった際にその追加されたインターフェイスに対する参
照を検索するための問合せ関数も有している。この問合
せ関数メンバは、囲んでいるマルチタイプオブジェクト
の制御オブジェクト管理インターフェイスの一部分であ
る。又、集合されるべきインターフェイスを実現するオ
ブジェクトのインスタンスも形成される。その形成中
に、囲んでいるマルチタイプオブジェクトに対するポイ
ンタが、囲まれるべきオブジェクトに通され、囲まれた
オブジェクトが囲んでいるマルチタイプオブジェクトと
通信できるようにする。集合されるべきインターフェイ
スを実現する形成されたオブジェクトは、集合されるべ
きインターフェイスに対する参照の検索をサポートする
問合せ関数メンバを有する。好ましい方法は、囲んでい
るマルチタイプオブジェクトの追加インターフェイス関
数メンバ又は追加オブジェクト関数メンバを呼び出し、
これに、集合されるべきインターフェイス実現する形成
されたオブジェクトに対する参照を通す。その後に、囲
んでいるマルチタイプオブジェクトの問合せ関数メンバ
が呼び出され、集合されたインターフェイスに対する参
照が検索される。
ンピュータシステムにおける方法を提供する。オブジェ
クトは、静的又は動的に集合することができる。静的な
集合を用いると、囲んでいるオブジェクトは、典型的
に、囲まれたオブジェクトの提示されたインターフェイ
スについてのコンパイル時知識を有する。それ故、囲ん
でいるオブジェクトのオブジェクト管理インターフェイ
スは、この知識を用いて、囲まれたオブジェクトの提示
されたインターフェイスへインターフェイスポインタを
返送するようにカスタマイズされる。これらの静的に集
合されたオブジェクトのインスタンスは、動的に(実行
時に)形成される。
ェクトが具体化され、これを用いてオブジェクト又はイ
ンターフェイスを実行時に集合することができる。囲ん
でいるオブジェクトは、囲まれたオブジェクト又はイン
ターフェイスについての前もった知識をもたず、従っ
て、囲んでいるオブジェクトによりコンパイル時知識が
使用されない。同様に、囲まれたオブジェクト及びイン
ターフェイスは、オブジェクト及びインターフェイスを
集合するのに使用される制御オブジェクト管理インター
フェイス除いて、囲んでいるオブジェクトのインターフ
ェイスの実現又は存在についての知識をもたない。又、
集合されたオブジェクト及びインターフェイスへのアク
セスを制御するためのルールメカニズムも設けられる。
に説明する。好ましい実施例では、本発明の方法及びシ
ステムは、中央処理ユニット、メモリ及び入力/出力装
置を含むコンピュータシステムにおいて実現される。
トはそのクライアントに複数のインタフェースを与え
る。オブジェクトを具体化するコンピュータプログラム
をクライアントと呼ぶ。集合オブジェクトは、1つ以上
の囲まれたオブジェクトと、IUnknownインタフェースの
実現部とからなり、この実現部を集合オブジェクトの制
御IUnknownインタフェースと呼ぶ。集合オブジェクト
は、そのクライアントにそれ自体のインタフェースと囲
まれたオブジェクトからのインタフェースを提示する。
制御IUnknownインタフェースのメソッドQueryInterface
はポインタを集合オブジェクトによって提示された各イ
ンタフェースに戻す。集合オブジェクトは各囲まれたオ
ブジェクトを具体化する。この具体化は、集合オブジェ
クトの構成中に実行できるし、囲まれたオブジェクトの
インタフェースが必要になるまで延期することもでき
る。各囲まれたオブジェクトは、制御IUnknownインタフ
ェースに対するポインタを含む。囲まれたオブジェクト
の提示されたインタフェースのメソッドQueryInterface
は、IUnknownインタフェースのメソッドQueryInterface
を呼び出すように実現されるのが好ましい。囲まれたオ
ブジェクトが実現される場合に、一般に開発者は、囲ん
でいるオブジェクトがどんなインタフェースを提示する
かについての知識はない。その結果、囲まれたオブジェ
クトのメソッドQueryInterfaceが制御IUnknownインタフ
ェースを呼び出して、要求したインタフェースのポイン
タを検索する。制御IUnknownインタフェースのメソッド
QueryInterfaceは、一般に、提示された全てのインタフ
ェースの知識をもって実現される。オブジェクトが囲ま
れない場合は、制御IUnknownインタフェースは、そのオ
ブジェクトのIUnknownインタフェースである。逆に、オ
ブジェクトが囲まれる場合は、制御IUnknownインタフェ
ースは囲んでいるオブジェクトのIUnknownインタフェー
スである。
参照カウントを維持する。集合オブジェクトが具体化さ
れる場合に、その参照カウントは、1にセットされる。
制御IUnknownのメソッドQueryInterfaceは、参照がクラ
イアントに戻されるときに、参照カウントをインクリメ
ントする。囲まれたオブジェクトの提示されたインタフ
ェースのメソッドAddRefは、制御IUnknownインタフェー
スのメソッドAddRefを呼び出し、集合オブジェクトの参
照カウントをインクリメントする。同様に、囲まれたオ
ブジェクトの提示されたインタフェースのメソッドRele
ase は、制御IUnknownインタフェースのRelease を呼び
出し、集合オブジェクトの参照カウントをディクリメン
トすると共に、参照カウントが0のときに集合オブジェ
クトを削除する。囲まれたオブジェクトが具体化される
場合には、囲まれたオブジェクトの参照カウントは、1
にセットされる。集合オブジェクトが削除された場合
は、各囲まれたオブジェクトのIUnknownインタフェース
のメソッドRelease が呼び出され、囲まれたオブジェク
トを消去する。
図である。集合オブジェクト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は、制御IU
nknownインタフェイスに対するポインタを含むように初
期化される。
yInterfaceは、提示された各インタフェイスに対するポ
インタを返送し、そしてポインタが返送されたときに集
合オブジェクトの参照カウントをインクリメントするこ
とができる。制御IUnknownのメソッドQueryInterface
は、実現部I3が実現するインターフェイスA、B及び
制御IUnknownのポインタに直接アクセスし、そして囲ま
れたオブジェクトのIUnknownインタフェースのメソッド
QueryInterfaceを呼び出して、囲まれたオブジェクトS
1及びS2の提示されたインタフェイスC及びFに対す
るポインタを検索する。囲まれたインタフェイスに対す
るポインタを返送するときには、制御IUnknownインタフ
ェースのメソッドQueryInterfaceは、制御IUnknownイン
タフェイスのメソッドAddRefを呼び出すことにより、集
合オブジェクトS3の参照カウントをインクリメントす
る。(制御IUnknownインタフェース以外の)各提示され
たインタフェースのメソッドQueryInterfaceは、制御IU
nknownインタフェースのメソッドQueryInterfaceを呼び
出すのが好ましい。 コード表3 void CreateInstanceS1(IUnknown *punkOuter, REFIID iid, void**ppv) { IUnknown * punk; S1::CreateInstance(punkOuter, &punk); punk->QueryInterface(iid, ppv) ; punk->Rclease(); } class IC:public IUnknown {//methods of IC } class ID:public IUnknown {//methods of ID } class S1:public IUnknown { public: static void CreareInstance(IUnknown *punkOuter,IUnknown**ppunk) { S1*pS1=newS1(punkOuter) ; pS1->QueryInterface (IID IUnknown,ppunk); } private: void S1(IUnknown * punkOuter):m C(this), m D(this) { if(punkOuter == NULL) m punkouter = this; else m punkouter = punkOuter, m refcount = 0; } class C:public IC { public: void C(S1*pS1) { m pS1 = pS1;} virtual boolean QueryInterface(REFIID iid,void**ppv) {return m pS1->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS1->m punkOuter->AddRef();} virtual void Release() { m pS1->m punkOuter->Release(); } // other methods of IC private: S1 *m pS1 } friend C ; C m C ; class D:public ID { public: void D(S1 *pS1)(m pS1 = pS1;} virtual boolean QueryInterface(REFIID iid, void **ppv) {return m pS1->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS1->m punkOuter->AddRef();} virtual void Release() { m pS1->m punkOuter->Release(); } // other methods of ID private: S1 *m pS1 } friend D ; D m D ; public: virtual boolean QueryInterface(REFIID iid, void **ppv) { ret = TRUE; switch(iid) {case IID C : *ppv = &m C ; m punkOuter->AddRef(); break; case IID D : *ppv = &m D ; m punkOuter->AddRef(); break; case IID IUnknown: *ppv = this ; AddRef(); break; default : ret = FALSE ; } return ret; } virtual void AddRef(){ m refcount++; } virtual void Release() {if(--m refcount == 0) delete this; } private: IUnknown *m punkOuter; int m refcount; }
いクラス定義に対して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::vfpt
r は、仮想関数表402を指し、データメンバ内の仮想
関数表ポインタ m CS1::C::vfptrは、仮想関数表40
3を指し、更に、データメンバ内の仮想関数表ポインタ
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の構成子である。
QueryInterfaceは、インタフェイスC、インタフェイス
D、又はインタフェイスIUnknownに対するポインタを返
送する。インターフェイスC又はインターフェイスDに
対するポインタが返送されるときには、メソッドS1::Qu
eryInterfaceは、メソッドS1::AddRefを呼び出し、オブ
ジェクトS1の参照カウントをインクリメントする。メ
ソッドS1::AddRefは、参照カウントをインクリメント
し、そしてメソッドS1::Release は、参照カウントをデ
ィクリメントすると共に、参照カウントが0になったと
きにオブジェクトS1を削除する。
スS1のオブジェクトのインスタンスを作成する。クラ
イアントがこの関数を呼び出し、クラスS1のオブジェ
クトを具体化する。従って、クライアントは、コンパイ
ル時間又は実行時にクラスS1の定義にアクセスせず
に、クラスS1のオブジェクトを具体化できる。具体化
されたオブジェクトS1が、集合オブジェクト及び返送
すべきインタフェースの識別子iid 内に囲まれるとき
に、関数CreateInstanceS1に、制御IUnknown(punkOute
r)に対するポインタが通される。関数CreateInstanceS1
は、識別されたインタフェースに対するポインタ(ppv)
を返送する。関数CreateInstanceS1は、パラメータpunk
Outer を通すようにメソッドS1::CreateInstanceを呼び
出す。メソッドS1::CreateInstanceは、オブジェクトS
1を具体化し、そしてオブジェクトS1のIUnknownイン
タフェースに対するポインタ(punk) を返送する。関数
CreateInstanceS1は、オブジェクトS1のメソッドQuer
yInterfaceを呼び出し、識別されたインタフェースに対
するポインタを検索する。関数CreateInstanceS1は、次
いで、オブジェクトS1のメソッドRelease を呼び出す
が、これは、一時ポインタpunkがもはや必要ないからで
ある。
クトS1を具体化し、オブジェクトS1のIUnknownイン
タフェースに対するポインタ(ppunk)を返送する。メソ
ッドS1::CreateInstanceには、制御IUnknownに対するポ
インタ(punkOuter)が通される。メソッドS1::CreateIn
stanceは新たな演算子を使用して、オブジェクトS1を
具体化する。具体化の間に、構成子S1::S1を呼び出し、
パラメータpunkOuterの値を通す。オブジェクトS1が
構成された後に、メソッドS1::CreateInstanceは、メソ
ッドS1::QueryInterfaceを呼び出し、オブジェクトS1
のIUnknownインタフェイスに対するポインタを検索す
る。
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を指す)。パラメータpunkOu
ter の値がNULLでなければ、構成子S1::S1は、データメ
ンバ m punkOuter をパラメータpunkOuter の値にセッ
トする。データメンバ m punkOuter は、オブジェクト
S1が囲まれている場合には、集合体の制御IUnknownの
値を指し、そしてオブジェクトS1が囲まれていない場
合には、オブジェクトS1の制御IUnknownを指す。構成
子S1::S1は、データメンバ m fercountをゼロに初期化
もする。
ポインタが通される。構成子C1::C1は、通されたポイン
タをデータメンバC::m pS1 内に格納する。このデータ
メンバC::m pS1 は、クラスCのメソッドによって使用
され、データメンバS1:: m punkOuter にアクセスする。
及びC::Releaseは、データメンバS1:: m punkOuter に
より指されたIUnknownインタフェースの対応メソッドを
呼び出し、これは、オブジェクトS1が囲まれるときに
集合体の制御IUnknownInterface を指す。
は、クラスCの構成子及びその他のメソッドに類似して
いる。
S1のインスタンスを示す。データメンバS1::C::m pS
1 、S1::D::m pS1 及び S1::m punkOuter は、オブジ
ェクトS1自体に対するポインタに初期化される。デー
タメンバ m C 及びm D のメソッドQueryInterface、
AddRef及びRelease は、オブジェクトS1のインタフェ
ースのIUnknownメソッドを呼び出す。
ェクトS2は、上述のオブジェクトS2と類似してい
る。 コード表4 void CreateInstanceS3(IUnknown *punkOuter, REFIID iid, void**ppv) { IUnknown *punk; S3::CreateInstance(punkOuter, &punk); punk->QueryInterface(iid, ppv) ; punk->Release(); } class IA:public IUnknown {//methods of class IA } class IB:public IUnknown {//methods of class IB } class S3:public IUnknown { public: static void CreareInstance(IUnknown *punkOuter,IUnknown **punk) { S3 *pS3=newS3(punkOuter) ; CreateInstanceS1(pS3->m punkOuter, IID IUnknown, pS3->m punkS1); CreateInstanceS2(pS3->m punkOuter, IID IUnknown, pS3->m punkS2); pS3->QueryInterface(IID IUnknown,ppunk);} private: void S3(IUnknown *punkOuter): m A(this), m B(this) { if( puniOuter==NULL) m punkouter=this; else m punkouter=punkOUter, m refcount=0; } void-S3(){ m punkS1->Release() ; m punS2->Re lease() ; } class A:public IA { public: void A(S3 *pS3){ m pS3 = pS3 } virtual boolean QueryInterface(REFIID iid,void **ppv) {return m pS3->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS3->m punkOuter->AddRef();} virtual void Release() { m pS3->m punkOuter->Release(); } \\ other methods of IA private: S3 *m pS3 ; }; friend A ; A m A ; class B:public IB { public: void B(S3 *pS3) { m pS3 = pS3 } virtual boolean QueryInterface(REFIID iid, void **ppv) {return m pS3->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS3->m punkOuter->AddRef();} virtual void Release() { 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: *ppv=this; AddRef() ; break; default: ret = FALSE; } return ret; } virtual void AddRef(){ m refcount++; } virtual void Release() {if(--m refcount == 0) delete this; } private: IUnknown *m punkOuter; int m refcount; IUnknown *m punkS1; IUnknown *m punkS2; };
いクラス定義に対するC++擬似コードを含む。クラス
S3は、インタフェイスIUnknownA、B、C及びFを提
示する。インタフェイスCを与えるために、クラスS3
はオブジェクトS1を囲み、インタフェイスCを提示す
る。インタフェイスFを与えるために、クラスS3はオ
ブジェクトS2を囲み、インタフェイスFを提示する。
オブジェクトS3は、インタフェイスC及びFに対する
ポインタを制御IUnknownインタフェイスのメソッドQuer
yInterfaceを介して戻すことによってインタフェイスC
及びFを提示する。オブジェクトS1のインタフェイス
D及びオブジェクトS2のインタフェイスEは、外部イ
ンタフェイスであるが、オブジェクトS3はこれらのイ
ンタフェイスを提示しない。
及びS3::Release は、集合体の制御IUnknownインタフェ
イスを構成する。メソッドS3::QueryInterfaceは、制御
IUnknownインタフェイスA、B、C及びFに対するポイ
ンタを返送する。制御IUnknownインタフェイスのポイン
タが返送されるときは、メソッドS3::QueryInterface
は、メソッドS3::AddRefを呼び出して、オブジェクトS
3に対する参照カウントをインクリメントする。メソッ
ドS3::AddRefは、参照カウントをインクリメントし、メ
ソッドS3::Release は参照カウントをディクリメント
し、参照カウントが0になるとオブジェクトS3を削除
する。インタフェイスA、B、C又はFに対するポイン
タが返送されるときは、メソッドS3::QueryInterface
は、制御IUnknownインタフェイスのメソッドS3::AddRef
を呼び出し、これは、S3オブジェクトが集合されない
ときは、メソッドS3::AddRefである。
スS3のオブジェクトのインスタンスを作成する。クラ
イアントは、この関数を呼び出して、クラス3のオブジ
ェクトを具体化する。このため、クライアントは、コン
パイル時及び実行時にクラスS3の定義にアクセスせず
にクラスS3のオブジェクトを具体化できる。具体化さ
れたオブジェクトS3が、集合オブジェクト、及びクラ
スS3により提示されたインタフェイスの識別子(iid)
に囲まれて戻される場合に、関数CreateInstanceS3に
は、制御IUnknownインタフェイス(punkOuter)に対する
ポインタが通される。関数CreateInstanceS3は識別され
たインタフェイスに対するポインタ(ppv)を戻す。関数C
reateInstanceS3は、パラメータpunkOuter を通すよう
にメソッドS3::CreateInstanceを呼び出す。メソッドS
3::CreateInstanceは、オブジェクトS3を具体化し、
オブジェクトS3のIUnknownインタフェイスに対するポ
インタ(punk)を戻す。関数CreateInstanceS3は、メソ
ッドS3::QueryInterfaceを呼び出し、識別されたインタ
フェイスに対するポインタを検索する。一時的ポインタ
punkは不要になるので、関数CreateInstanceS3は、メソ
ッドS3::Release を呼び出す。
クトS3を具体化し、オブジェクトS3のIUnknownに対
するポインタ(ppunk)を戻す。メソッドS3::CreateInst
anceには、制御IUnknownに対するポインタ(punkOuter)
が通される。メソッドS3::CreateInstanceは、新たな演
算子を使用してオブジェクトS3を具体化する。具体化
の間に、構成子S3::S3を呼び出し、パラメータpunkOute
r を通す。オブジェクトS3が構成された後、メソッド
S3::CreateInstanceは関数CreateInstanceS1を呼び出
し、囲まれたオブジェクトS1を作成する。メソッドS
3::S3CreateInstanceはパラメータpS3->m punkOuter
及びびIUnknownインタフェイスのインタフェイス識別子
を通し、オブジェクトS1のIUnknownインタフェースに
対するポインタが返送される。メソッドS3::CreateInst
anceは、データメンバS3:: m punkS1内にその返送され
たポインタを格納する。メソッドS3::CreateInstance
は、関数CreateInstanceS2を呼び出し、オブジェクトS
1の作成と同様の方法でオブジェクトS2を作成する。
メソッドS3::CreateInstanceは、メソッドS3::QueryInt
erfaceを呼び出し、IUnknownインターフェイスに対する
ポインタを検索する。
の参照カウントをインクリメントする。メソッドS3::Re
lease は、参照カウントをディクリメントする。参照カ
ウントが0になると、メソッドS3::Release は、オブジ
ェクトS3を削除する。
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 をセットする。パラメータpunk
Outer の値がNULLでない場合には、構成子S3::S3はデー
タメンバ m punkOuter をパラメータpunkOuter の値に
セットする。データメンバ m punkOuterは、オブジェ
クトS3が囲まれている場合には、集合体の制御IUnkno
wnインタフェイスの値を指し、オブジェクトS3が囲ま
れていない場合には、オブジェクトS3のIUnknownイン
タフェイスを指す。構成子S3::S3は、データメンバ m
refcountを0に初期化する。
e を呼び出して、囲まれたオブジェクトS1の参照カウ
ントをディクリメントする。オブジェクトS1の具体化
の間に参照カウントは1にセットされているので、メソ
ッドS1::Release はオブジェクトS1を削除する。消去
関数S3::-S3 は、同様の方法でオブジェクトS2の参照
カウントをディクリメントする。
スCのメソッドと同様の動作を有する。従って、インタ
フェースA及びBは、オブジェクトS3が囲まれた場合
に提示できる。
イアウトを示すブロック図である。このデータ構造レイ
アウトは、インスタンスデータ501、仮想関数表50
2、503及び504、メソッド505ないし517、
オブジェクトS1 401ないし413、及びオブジェ
クトS2 519を含む。インスタンスデータ501
は、制御IUnknownインタフェイスの仮想関数表に対する
ポインタと、クラスA及びBのインスタンスであるデー
タメンバ m A 及び m B と、オブジェクトS3のIUnk
nownインタフェースを指すデータメンバ m punkOuter
と、オブジェクトS3対応の参照カウントを含むデータ
メンバ m refcountと、囲まれたオブジェクトS1のIU
nknownインターフェイスを指すデータメンバ m punkS1
と、囲まれたオブジェクトS2 519のIUnknownイン
タフェイスを指すデータメンバ m punkS2とを含む。囲ま
れたオブジェクトS1が具体化されると、そのデータメ
ンバ S1::m punkOuter は初期化され、オブジェクトS
3のIUnknownインタフェースを指す。同様に、囲まれた
オブジェクトS2が具体化されると、そのデータメンバ
S2::m punkOuter は初期化され、オブジェクトS3の
IUnknownインタフェースを指す。
と囲まれたオブジェクトとの共同動作を示すブロック図
である。図6は、別のオブジェクトに囲まれていないク
ラスS1のオブジェクトを示すブロック図である。クラ
スS1のオブジェクト601はデータメンバ m punkOu
ter を含み、これはIUnknownインタフェースと、メソッ
ド603、604、605及び606を指す。メソッド
IUnknown::QueryInterface603は、要求されたインタ
フェイスに対するポインタを戻し、参照カウントをイン
クリメントする。メソッド C::QueryInterface605及
び C::AddRef606は、IUnknownインタフェースの対応
するメソッドを呼び出す。クラスDのメソッドの実現部
(図示せず)は、クラスCと同様である。図7は、クラ
スS1及びS2のオブジェクトを囲むクラスS3のオブ
ジェクトを示す図である。オブジェクトS2は、オブジ
ェクトS1と同様であり、図示していない。クラスS1
のオブジェクト601のデータメンバ m punkOuter 6
02は、クラスS3のオブジェクト610のIUnknownイ
ンタフェイスを指す。メソッドIUnknown::QueryInterfa
ce613は、提示された各オブジェクトに対するポイン
タを返送し、データメンバ m punkS1 619で指示さ
れたメソッドIUnknown::QueryInterface603を呼び出
し、インタフェースCに対するポインタを検索する。デ
ータメンバ m punkOuter 612は、クラスS3オブジェ
クト610のIUnknownインターフェイスを指す。クラス
A及びBオブジェクトのメソッドQueryInterface615
及び617は、データメンバ m punkOuter 612によ
って示されるメソッドを呼び出す。
制御IUnknownインタフェイスのメソッドQueryInterface
は、囲まれたオブジェクトのIUnknownインタフェイスの
メソッドQueryInterfaceを呼び出し、提示されたインタ
フェイスに対するポインタを検索する。本発明の別の実
施例においては、囲んでいるオブジェクトが提示する囲
まれたオブジェクトのインタフェイスに対するポインタ
を、囲んでいるオブジェクトがキャッシュ処理できる。
従って、制御IUnknownのメソッドQueryInterfaceが呼び
出されると、このメソッドは、囲まれたオブジェクトの
IUnknownインタフェイスのメソッドQueryInterfaceを呼
び出すのではなく、制御IUnknownインタフェイスのメソ
ッドAddRefを呼び出した後に、そのキャッシュ処理され
たポインタを検索して戻すことができる。この別の実施
例を実現するためは、囲んでいるオブジェクトが、各キ
ャッシュ処理されたポインタのデータメンバを定義す
る。囲まれたオブジェクトが具体化されるときは(一般
に囲んでいるオブジェクトの構成中に)、囲まれたオブ
ジェクトのIUnknownインタフェースのメソッドQueryInt
erfaceを呼び出して、提示されたインタフェイスのポイ
ンタを検索する。検索されたポインタは参照カウントさ
れず、囲んでいるオブジェクトが囲まれたオブジェクト
に対して1つのポインタ(例えば、S3:: m punkS1)の
みを効果的に維持するのが好ましい。囲まれたオブジェ
クトは、メソッドRelease に対する1回のコールで削除
することができる。従って、ポインタがキャッシュ処理
された後に、囲まれたオブジェクトのIUnknownインタフ
ェイスのメソッドRelease が呼び出され、そのキャッシ
ュ処理されたポインタに属する参照カウントを除去す
る。
nownインタフェイスのメソッドQueryInterfaceの実現部
は、どのインタフェイスが提示されるかを指定するswit
chステートメントを含む。例えば、メソッドS3::QueryI
nterfaceのswitchステートメントは、提示された各イン
タフェイスA、B、C及びFと制御IUnknownに対するca
seラベルを含む。従って、提示されたインタフェイスは
囲んでいるオブジェクトの実現中に静的に定義される。
別の実施例においては、制御IUnknownインタフェイスメ
ソッドQueryInterfaceは、囲まれたオブジェクトの外部
インタフェイスに関する知識が特になくても実現でき
る。メソッドQueryInterfaceが、実現しないインタフェ
イスに対するポインタを返送するように要求されたとき
には、囲まれたオブジェクトのIUnknownインタフェイス
のメソッドQueryInterfaceを呼び出し、囲まれたオブジ
ェクトにより実現されれば、その識別されたインタフェ
イスに対するポインタを検索する。コード表5は、この
別の実施例を実現するオブジェクトS3の制御IUnknown
のメソッドQueryInterfaceの好ましい実現に対するC+
+擬似コードである。囲まれたたオブジェクトの外部イ
ンタフェイスに対するポインタを戻すことに加えて、制
御IUnknownのメソッドQueryInterfaceは、他の全ての外
部インタフェイスを提示する一方、特定の外部インタフ
ェースを提示しないように実現できる。 コード表5 virtual boolean QueryInterface(REFIID iid,void**ppv) {ret = TRUE; switcn(iid) {case IID A : *ppv = &m A; m punkOuter->AddRef(); break; case IID B : *ppv = &m B; m punkOuter->AddRef(); break; case IID IUnknown: *ppv = this; AddRef(); break; default : if(m punkS1->QueryInterface(iid,ppv) {return,ret; }; if(m punkS2->QueryInterface(iid,ppv) {return,ret; }; ret = FALSE ; } return ret; }
ついては述べなかった。種々の形式ののエラーチェック
を実行して、集合体が適切に作成されるよう確保するこ
とが望ましい。例えば、囲んでいるオブジェクトが、集
合できないオブジェクトを囲もうと試みた場合には、囲
んでいるオブジェクトの具体化が失敗に終わる(例え
ば、関数CreateInstanceS1が欠陥を示すフラグを返送す
る)。
自体は、囲んでいるオブジェクト内に囲まれたオブジェ
クトとなり得る。この囲い込み(ネスティング)は、い
かなる深さでも起こり得る。或いは又、集合オブジェク
トは、非集合可能に実施することもできる。クラスXX
に対する関数CreateInstanceXXは、パラメータpunkOute
r がナルでない場合、即ち、集合が所望される場合に欠
陥を示すフラグを返送することができる。
トの各外部インタフェイスに対するオブジェクトは、集
合可能なオブジェクトのデータメンバとして具体化され
る。別の実施例においては、外部インタフェイスは、集
合可能なオブジェクトのデータメンバとして実現される
のではなく、集合可能なオブジェクトによって継承され
る。コード表6は、外部インタフェイスC及びDを有す
る集合可能なクラスの好ましいクラス定義S1に対する
C++擬似コードを含む。クラスS1は、抽象クラスIC
及びIDを継承する。インタフェースIC及びIDの実現部
は、データメンバm punkOuter にアクセスするために
導出クラスS1に対するポインタを記憶する必要はない
が、IUnknownインターフェイス(IUnknownS1)の特殊な非
継承の実現部は必要とされる。これに対し、インタフェ
イスIC及びIDの実現部は、コード表3に示すように、導
出クラスS1に対するポインタをデータメンバ m pS1
に記憶する。当業者であれば、インタフェイスの継承を
用いた他の実現部も考えられるであろう。 コード表6 class S1:public IC,public ID {public: virtual boolean QueryInterface(REFIID iid,void **ppv) {return m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m punkOuter->AddRef();} virtual void Release() { m punkOuter->AddRef();} //implementation of IC and ID private: class IUnknownS1:public IUnknown { public: IUnknownS1(S1 *pS1) { m pS1 = pS1; m refcount = 0; } virtual boolean QueryInterface(REFIID iid, void **ppv) {ret = TRUE; switch(iid) { caseIID IUnknown: *ppv = this; AddRef() ; break; caseIID C : *ppv = (IC*)m pS1 ; m pS1->m punkOuter->AddRef(); break; caseIID D : *ppv = (ID*)m pS1 ; m pS1->m punkOuter->AddRef(); break; default: ret = FALSE; }; } virtual void AddRef() { m refcount++; } virtual void Release(){if(--m refcount == 0) delete m pS1;} private: int m refcount; S1 m pS1 ; } friend IUnknownS1 ; IUnknownS1 m IUnknownS1; public: static void CreateInstance(IUnknown *punkOuter,IUnknown **ppunk) { S1 *pS1 = newS1(punkOuter); pS1->QueryInterface( IID Unknown, ppunk) ; } private: void S1(IUnknown *punkOuter):m IUnknownS1(this) { if(punkOuter == NULL) m punkOuter = &m IUnknownS1; else m punkOuter = punkOuter; } IUnknown m punkOuter ; }
スのインスタンスは、囲んでいるオブジェクトの形成後
の任意の時間にその囲んでいるオブジェクトにこれらイ
ンスタンスを追加することによって組み合わされる。こ
のようにして、新たな又は変更されたインターフェイス
を既存の(ベース)オブジェクトと組み合わせて、その
ベースオブジェクトのコードがコンパイル又はリンクさ
れた後にベースオブジェクトの見掛け上の動作を変更す
ることができる。即ち、ベースオブジェクトの動作(ベ
ースオブジェクトのメソッドにより実行される)は外部
には変更されたように見えるが、ベースオブジェクトの
動作を実行するメソッドは、実際には変更されていな
い。ベースオブジェクトは、囲んでいるオブジェクト内
に囲み込まれ、その後に、新たな又は変更されたインタ
ーフェイスが追加される。
クセスされるときには、囲んでいるオブジェクトは、ど
のインターフェイスが返送するかそして一致するインタ
ーフェイスが2つ以上ある場合はその要求されたインタ
ーフェイスをいかに呼び出すかを決定する役目を果た
す。例えば、集合オブジェクトに3つのIPrintインター
フェイスが存在する場合には、囲んでいるオブジェクト
は、どのIPrintインターフェイスが返送するか、或いは
それ自身のIPrintインターフェイスを返送するかどうか
を決定し、これは、他のIPrintインターフェイスのメソ
ッドの組み合わせをいかに呼び出すかを知る。囲んでい
るオブジェクトは、固定の又は指定可能な1組の組み合
わせルールからこの決定を行うことができる。
ースオブジェクトの既に定義されたインターフェイスの
新たな実現部にアクセスすることによりその囲まれたベ
ースオブジェクトの標準的な動作をオーバーライドする
のに使用できる。又、これらのルールは、囲まれたベー
スオブジェクトの一部分として最初に定義されない能力
を追加することによりその囲まれたベースオブジェクト
の動作を増強するのに使用することもできる。これらの
オーバーライド及び増強能力の両方は、ベースオブジェ
クトに新たな又は変更されたインターフェイスを追加す
ることによって与えられる。これらの能力に加えて、標
準的な囲んでいるオブジェクトは、囲まれたオブジェク
トに対するデフォールト動作を実行することができる
(囲まれたオブジェクト又は追加されたインターフェイ
スによって与えられない場合に呼び出すための方法を実
行するインターフェイス)。又は、標準的な囲んでいる
オブジェクトは、全ての囲まれたオブジェクトに対して
典型的に存在する方法(プリンティングのような)に対
する制御(オーバーライド)動作を実行することができ
る。
ラムの実行中にインターフェイスのインスタンス(オブ
ジェクトによって実行される)を一緒に集合できるよう
にすることによりオブジェクトを動的に変更することが
できる。オブジェクトを具体化するコンピュータプログ
ラムは、クライエントプログラムである。集合は、それ
らの各々のインターフェイスを囲んでいるオブジェクト
内に囲い込むことにより多数の異なるオブジェクトの能
力を組み合わせるプロセスである。囲んでいるオブジェ
クトは、次いで、制御IUnknownインターフェイスの囲ん
でいるオブジェクトの実現部により提示しようとする全
てのインターフェイスへのアクセスを支援するという役
目を果たす。
は、それが集合しようとするインターフェイス(オブジ
ェクト)を前もって知る必要があった。静的な集合を用
いると、プログラマは、囲んでいるオブジェクトが提示
しなければならないのはその集合オブジェクトインター
フェイスのどれかを前もって判断し、そしてその囲んで
いるオブジェクトの制御IUnknownのQueryInterfaceメソ
ッドを実施して、これらの提示されたインターフェイス
に対するポインタを要求時に返送する。制御IUnknownの
QueryInterfaceメソッドは、個々の囲まれたオブジェク
トの対応するIUnknownインターフェイスに対する参照を
維持することによりこのタスクを実行する。(これらの
参照は、囲んでいるオブジェクトが、囲まれたオブジェ
クトを具体化するときに形成される。)1つの囲まれた
オブジェクトの提示されたインターフェイスを参照する
ための要求が受け取られたときには、制御IUnknownのQu
eryInterfaceメソッドは、その要求に応答するために、
囲まれたオブジェクトの対応するIUnknownインターフェ
イスを呼び出す。囲まれたオブジェクトは、囲んでいる
オブジェクトがどのインターフェイスを提示するか知ら
ないので、囲まれたオブジェクトによって受け取られる
全ての外部要求は、囲んでいるオブジェクトへ通され、
これにより、一緒に集合された他の囲まれたオブジェク
トにおいて定義されたインターフェイスへアクセスでき
るようにする。
も支援する。好ましい実施例では、囲んでいるオブジェ
クトは、具体化されたインターフェイスを登録しそして
それらに対する参照を後で検索するメソッドを与える。
更に、集合オブジェクトからインターフェイスが要求さ
れたときには、本発明は、同じインターフェイスの2つ
以上のインスタンスが集合オブジェクトに存在する場合
にどのインターフェイスを検索しそしてそれらをいかに
組み合わせて呼び出すかの判断を変更するためのメソッ
ドを提供する。
マルチタイプオブジェクトを用いて実施される。マルチ
タイプオブジェクトとは、種々のタイプのオブジェク
ト、ひいては、その名前を集合することのできるオブジ
ェクトをいう。集合できるようにコード化されたインタ
ーフェイスのみをマルチタイプオブジェクト内に囲むこ
とができる。(即ち、例えば、このようなインターフェ
イスは、インターフェイス及び参照カウント要求を、囲
んでいるオブジェクトへ送ることができる。)マルチタ
イプオブジェクトは、特定のインターフェイス又はオブ
ジェクトの集合を要求すると共に、要求されたインター
フェイスをいかに呼び出すかを判断するためのルールを
追加するIMultitypeインターフェイスを与える。以下の
コード表7は、IMultitypeインターフェイスの好ましい
定義のための擬似コードを含んでいる。 コード表7 class IMultiType: public IUnknown { virtual HRESULT AddObject (ULONG list, BOOLEAN headoflist, IUnknown* punkobj)=0; virtual HRESULT AddInterface (REFIID iid, ULONG list, BOOLEAN headoflist, void**ppv=0; virtual HRESULT AddRule (REFIID iid, URULE *prule)=0; virtual Enum (ULONGi; REFIIDiid, ULONG list, BOOLEAN headoflist; void**ppv=0; }
クトに2つのオブジェクトを追加するシーケンスのブロ
ック図である。図8は、マルチタイプオブジェクトのイ
ンスタンスを示すブロック図である。オブジェクトMT
O 7A01は、提示されたインターフェイスであるIM
ultitypeインターフェイスMT及び制御IUnknownを実行
する。マルチタイプオブジェクトに外部インターフェイ
スが追加されるときには、マルチタイプオブジェクトが
集合オブジェクトとなる。マルチタイプオブジェクトの
実現部は、それが集合に追加したインターフェイスのリ
スト7A02、7A09及び7A10を含んでいる。マ
ルチタイプオブジェクトは、これらのリストを用いて、
マルチタイプオブジェクトの制御IUnknownインターフェ
イスによりその囲まれた集合オブジェクトの種々のイン
ターフェイスを呼び出す。又、マルチタイプオブジェク
トは、インターフェイスリスト7A02、7A09及び
7A10からインターフェイスをアクセスしそして組み
合わせるためのルールのリスト7A11も含んでいる。
マルチタイプオブジェクトの強力な能力が与えられる。
AddRule メソッドを用いて固定又は指定することができ
るルール7A11のリストは、特定のインターフェイス
に対する異なるインターフェイスリストの相互作用及び
使用を指定する。従って、他のルールを選択するための
ルールと、特定のインターフェイスを選択して組み合わ
せるためのルールとが存在する。3つの異なるインター
フェイスリスト7A02、7A09及び7A10は、オ
ーバーライド、増強、デフォールト及び制御能力を支援
するために設けられている。マルチタイプオブジェクト
にインターフェイスが追加されるときには、集合を形成
するクライエントプログラムが、インターフェイスの追
加に使用すべきリストを指定する。リスト7A02は通
常のリストを構成し、リスト7A09はデフォールトリ
ストを構成し、そしてリスト7A10はオーバーライド
リストを構成する。基本的に、オーバーライドリスト
は、通常のリスト上のインターフェイスの前にアクセス
する必要のあるインターフェイスを指すことによりオー
バーライド及び制御能力を実行するよう意図される。デ
フォールトリストは、オーバーライドリスト及び通常リ
ストが要求されたインターフェイスを含まないときだけ
アクセスされるインターフェイスを指示するように意図
される。これらのリストの相互作用については、IRule
インターフェイスの説明において詳細に述べる。
icインターフェイスを集合した後のマルチタイプオブジ
ェクト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
の一部として集合された他のインターフェイスをアクセ
スするために後で使用することができる。
atabase インターフェイスを追加した後の結果のマルチ
タイプオブジェクトMTOを示すブロック図である。こ
の点において、集合オブジェクトMTO 7C01は、
図8について述べたIMultitypeインターフェイスと、図
9について述べた囲まれたスプレッドシートオブジェク
トS1と、データベース能力を実行する囲まれたデータ
ベースオブジェクトS2 7C07とを備えている。囲
まれたオブジェクトS2は、外部インターフェイスIDat
abase (D) のインスタンスと、IUnknownのインターフェ
イスとを実行する。IMultitypeインターフェイスのAddO
bject メソッドを用いてマルチタイプオブジェクトMT
Oに囲まれたオブジェクトS2が追加されたときには、
集合されたインターフェイス7C02の通常のリスト
は、2つのエレメント7C03及び7C06を含む。エ
レメント7C06は、囲まれたオブジェクトS2のIUnk
nownインターフェイスを識別する。S1と同様に、S2
のIUnknownインターフェイスは、外部インターフェイス
Dに対するポインタを返送することができ、囲んでいる
オブジェクトMTOに対するポインタ7C08を他のM
TOインターフェイスへのアクセスのために含んでい
る。
クトを追跡するのに使用されるデータ構造体の多数の他
の実施例が考えられることが当業者に明らかであろう。
例えば、使用するリストの数及び種類を変更することが
できる。特に、1つのリストしかもたないようにするこ
ともできるし、オーバーライド又はデフォールトリスト
を任意に形成することもできる。又、全オブジェクトが
集合されるときには、各リストエレメントが集合される
べき正確なインターフェイスのみを指示し、IUnknownの
オブジェクトは指示しないようにすることもできる(Ad
dInterface型のマルチタイプオブジェクトのみをサポー
トする)。或いは又、どのインターフェイスが集合に追
加されるかに係わりなく、各リストエレメントがIUnkno
wnのオブジェクトを指すことを必要とすることもできる
(AddObject 型のマルチタイプオブジェクトのみをサポ
ートする)。更に、インターフェイス識別子の種々の記
憶されたリスト又はハッシュテーブルを含む他のリスト
実現を使用することもできる。 コード表8 void CreateInstanceS1(IUnknown*punk,REFIIDiid,void**ppv) { IUnknown*punk; S1::CreateInstance(punkOuter,&punk); punk->QueryInterface(iid,ppv); punk->Release(); } classIBasic: publicIUnknown { virtualvoidFile()=0; virtualvoidEdit()=0; virtualvoidFormula()=0; virtualvoidFormat()=0; } classIPrint: publicIUnknown { virtualvoidPrint(void**ppobj)=0; } classS1: publicIUnknown { public: static void CreateInstance(IUnknown*punkOuter,IUnknown**ppunk) { S1*pS1=new S1(punkOuter); pS1->QueryInterface(IID IUnknown,ppunk); } private: void S1(IUnknown*punkOuter):m B(this),m P(this) { if(punkOuter==NULL) m punkOuter=this; else m punkOuter=punkOuter; m refcount=0; } class B: public IBasic { public: void B(S1*pS1) {m pS1=pS1;} virtual boolean QueryInterface(REFIIDiid,void**ppv) { return m pS1->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS1->m punkOuter->AddRef();} virtual void Release() { m pS1->m punkOuter->Rerease(); } //other methds of IBasic including File, Edit, Formula, Format, GetCell private: S1 *m pS1; } friend B; B m B; class P: public IPrint { public: void P(S1*pS1) {m pS1=pS1;} virtual boolean QueryInterface(REFIIDiid,void**ppv) { return m pS1->m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() { m pS1->m punkOuter->AddRef();} virtual void Release() { m pS1->m punkOuter->Rerease(); } //other methds of IBasic including Print private: S1 *m pS1; } friend P; P m P; public: virtual boolean QueryInterface(REFIIDiid,void**ppv) { ret=TRUE; switch(iid) { case IID B: *ppv=&m B; m punkOuter->AddRef(); break; case IID P: *ppv=&m P; m punkOuter->AddRef(); break; case IID IUnknown: *ppv=this; AddRef(); break; default: ret=FALSE; } return ret; } virtual void AddRef(){m refcount++; } virtual void Release() {if(--m refcount==0)delete this;} private: IUnknown *m punkOuter; int m refcount; }
クトS1の好ましいクラス定義に対するC++擬似コー
ドを含み、これは、S1オブジェクトのインスタンスを
形成するグローバルな関数と共に集合(集合オブジェク
ト)内に囲むことのできるものである。クラスIUnknow
n、IBasic及びIPrintは、S1を構成する各インターフ
ェイスのメソッドを定義するインターフェイスである。
クラスS1は、IUnknownインターフェイス、IBasicイン
ターフェイス及びIPrintインターフェイスを実施する。
IBasic及びIPrintインターフェイスは、外部インターフ
ェイスとして実施される。
ンスタンスのデータ構造レイアウトのブロック図であ
る。インスタンス構造801は、クラスS1(m B 、m
P 、m punkOuter)のデータメンバと、仮想関数表ポ
インタ(S1::vfptr) とを含んでいる。データメンバm
B 及びm P は、各々、クラスB及びPのオブジェクト
のインスタンスである(これらは、インターフェイスIB
asic及びIPrintのクラス実施である)。データメンバm
B 及びm P はクラスS1のフレンドであり、m B
及びm P オブジェクトがm punkOuter のようなクラ
スS1のプライベートメンバにアクセスできるようにす
る。仮想関数表ポインタS1::vfptr は仮想関数表802
を指し、データメンバm B 内の仮想関数表ポインタS
1::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オブジェ
クト自体を指すように初期化される。
トS1は、静的な集合を参照して述べた集合オブジェク
トの要件に合致する。動的な集合を行う目的で、コード
表8は、S1をその囲んでいるオブジェクトとその集合
時にいかに自動的に通信できるか及び関数S1::QueryInt
erfaceから何が返送されるかを示している。より詳細に
は、S1オブジェクトの形成時に、囲んでいるマルチタ
イプオブジェクトの制御IUnknownインターフェイスのポ
インタがメソッドCreateInstanceへ通される。このポイ
ンタは、次いで、S1の外部インターフェイス(IBasic
及びIPrint)のメソッドQueryInterfaceによって使用さ
れ、インターフェイス要求をその囲んでいるマルチタイ
プオブジェクトへルート指定する。S1インターフェイ
スがその閉じているマルチタイプオブジェクトから要求
されたときには、その閉じているマルチタイプオブジェ
クトの制御IUnknownのメソッドQueryInterfaceがメソッ
ドS1::QueryInterfaceを呼び出し、これは、インターフ
ェイスIBasic、インターフェイスIPrint又はインターフ
ェイスIUnknownの適当なインスタンスに対するポインタ
を返送し、そしてS1オブジェクトの参照カウントを適
宜に増加する。(S1::QueryInterfaceを呼び出すために
囲んでいるマルチタイプオブジェクトによって使用され
るメカニズムは、以下で詳細に説明する。)
オブジェクトの制御IUnknownインターフェイスのポイン
タを集合オブジェクトへ通すために多数の別の態様が存
在することが明らかであろう。例えば、形成時にポイン
タを通すのではなく、特に、このポインタを通すための
メソッドを定義することができる。この実施例を用いる
場合に、オブジェクトは、いったん集合されると、後で
集合解除することもできるし、或いはオブジェクトを後
で異なる囲み込みオブジェクトへ集合することができ
る。
にマルチタイプオブジェクトといかに相互作用するかを
理解するために、クライエント要求がなされるときのコ
ールシーケンスについて調べるのが有用であろう。以下
のコード表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::QueryInte
rface)においてそれを呼び出す。
ションが、囲んでいるマルチタイプオブジェクトのポイ
ンタではなくて、囲まれたオブジェクトのインターフェ
イス(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のように機能する。
2オブジェクトは、上記したS1オブジェクトと同様で
ある。 コード表11 void CreateInstanceMTO(IUnknown*punkOuter,REFIIDiid,void**ppv) { IUnknown*punk; MTO::CreateInstance(punkOuter,&punk); punk->QueryInterface(iid,ppv); punk->Release(); } classIMultitype:public IUnknown { virtual HRESULT AddObject(ULONGlist,BOOLEAN headoflist, IUnknown*punkobj)=0; virtual HRESULT AddInterface(REFIIDiid,ULONGlist,BOOLEAN headoflist, void*pv)=0; virtual HRESULT AddRule(REFIIDiid,IRule*prule)=0; virtual HRESULT Enum(ULONGi,REFIIDiid,ULONGlist,BOOLEAN headoflist, void*pv)=0; } classMTO: public IUnknown { public: static void CreateInstance(IUnknown*punkOuter,IUnknown**ppunk) { MTO*pMTO=MTO=new MTO(punkOuter); pMTO->QueryInterface(IID IUnknown,ppunk):} private: void MTO(IUnknown*punkOuter):m MT(this) { if(punkOuter==NULL) m punkOuter=this; else m punkOuter=punkOuter;} classMT:public IMultitype { public: void MT(MTO*pMTO){m pMTO=pMTO } virtual boolean QueryInterface(REFIIDiid,void**ppv) { return m pMTO-> m punkOuter->QueryInterface(iid,ppv); } virtual void AddRef() {m pMTO-> m punkOuter->AddRef();} virtual void Release() {m pMTO-> m punkOuter->Release(); } virtual boolean AddObject(ULONGlist,BOOLEAN headoflist, IUnknown*punkobj) { item*pitem; pitem=new(item); pitem->iid=IID Unknown; pitem->pobj=punkobj; pitem->pnext=null; pitem->pprev=null; switch(list) { case NORMAL LIST: //...headoflist が真の場合は第1項目として通常リストに //挿入する。さもなくば、最後の項目として挿入する; case DEFAULT LIST: //...headoflist が真の場合は第1項目としてデフォールト //リストに挿入する。さもなくば、最後の項目として挿入す //る; case OVERRIDE LIST: //...headoflist が真の場合は第1項目としてオーバーライ //ドリストに挿入する。さもなくば、最後の項目として挿入 //する。 default: //... 通常リストの頭部に挿入する; } } virtual boolean AddInterface(REFIIDiid,ULONGlist,BOOLEAN headoflist, void*pv) { ... pitem->iid=iid; pitem->pobj=pv; //AddObject メソッドと同じコードであるが、リスト項目は特定の //インターフェイスを指し、IUnknownインターフェイスを指さない ... } \\IMultitypeの他のメソッド... private: MTO *m pMTO; }; friend MT; MT m MT; public: virtual boolean QueryInterface(REFIIDiid,void**ppv) { boolean done=TRUE; item*pitem; switch(iid) { case IID IMultiType: *ppv=&m MT; m punkOuter->AddRef(); break; case IID IUnknown: *ppv=this; AddRef(); break; default: //第1の一致インターフェイスに対してオーバーライドリス //トをサーチする done=FALSE; pitem=m poverride itemhead; while((done==FALSE)&&(pitem->pnext!=null)){ switch(pitem->iid) { case IID IUnknown: if(pitem-> pobj-> QueryInterface(iid,ppv)==TRUE) done=TRUE; else pitem=pitem->pnext; break; default; if(pitem->iid==iid) { ppv=pitem->pobj; done=TRUE; } else pitem=pitem->pnext; }} //第1の一致インターフェイスに対し通常リストをサーチする //まだ見つからない場合は if(done==FALSE) { pitem=m pnormal itemhead; while((done==FALSE)&&(pitem->pnext!=null)){ ...//オーバーライドリストの場合と同じコード } //第1の一致インターフェイスに対しデフォールトリストをサーチ //まだ見つからない場合は if(done==FALSE) { pitem=m pdefault itemhead; while((done==FALSE)&&(pitem->pnext!=null)){ ...//オーバーライドリストの場合と同じコード } break; } return done; } virtual void AddRef() { m refcount++; } virtual void Release(){if(--m refcount==0)delete this;} private: Iunknown *m punkOuter; int m refcount,m occurrence; struct item { REFIID idd; void *pobj; item *pnext; item *pprev}; item *m pnormal itenhead=null,*m pnormal itentail=null, *m pdefault itenhead=null,*m pdefault itentail=null, *m poverride itenhead=null,*m poverride itentail=null, };
に集合するのに使用できるマルチタイプオブジェクトの
好ましいクラス定義に対するC++擬似コードである。
クラスMTOは、マルチタイプオブジェクトに対しIMul
titypeインターフェイス及び制御IUnknownインターフェ
イスのインスタンスを実行する。
クラスMTOのオブジェクトのインスタンスを形成す
る。クライエントはこの関数を呼び出し、クラスMTO
のオブジェクトを具体化する。この関数を用いて、クラ
イエントは、コンパイル時間又はランタイムにMTOク
ラス定義をアクセスすることなくクラスMTOのオブジ
ェクトを具体化することができる。関数CreateInstance
MTO には、具体化されたMTOオブジェクトが別のオブ
ジェクト内に集合されたときに制御IUnknownインターフ
ェイス(punkOuter) に対するポインタが通される。この
関数は、パラメータpunkOuter に沿って通されるメソッ
ドMTO::CreateInstance を呼び出す。
オブジェクトを具体化し、MTOオブジェクトのIUnkno
wnインターフェイスに対するポインタ(ppunk) を返送す
る。このインターフェイスは、次いで、関数CreateInst
anceMTO によって使用され、クライエントアプリケーシ
ョンにより実際に要求されたインターフェイスを返送す
ることができる。メソッドMTO::CreateInterfaceは、新
たな演算子を使用してMTOオブジェクトを具体化す
る。具体化の間に、構成子MTO::MTOが呼び出されそして
パラメータpunkOuter の値が通される。
び 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インターフェイスを指す。
ultitypeインターフェイスは、4つのメソッドAddObjec
t 、AddInterface、AddRule 及びEnumを含んでいる。メ
ソッドAddObject は、マルチタイプオブジェクト内に囲
まれるべきオブジェクトを追加するという役割を果たす
(全てのオブジェクトインターフェイスはアクセス可能
とされる)。これは、図12を参照して説明する。メソ
ッドAddInterfaceは、マルチタイプオブジェクトに単一
のインターフェイスインスタンスを追加する役目を果た
す。メソッドAddInterfaceはメソッドAddObject に関連
して説明する。メソッドAddRule は、クライエントアプ
リケーションが特定のインターフェイス識別子を要求す
るときに問い合わせすべきオブジェクト又は返送すべき
インターフェイスのどの組み合わせかを決定するのに使
用される組み合わせルールをクライエントアプリケーシ
ョンが指定できるようにする。これは、ルールオブジェ
クトに関連して詳細に説明する。メソッドEnumは、マル
チタイプオブジェクトによって維持される種々のインタ
ーフェイスリストを列挙するためにルールオブジェクト
によって使用される。このメソッドは、ルールオブジェ
クトに関連して詳細に説明する。
って実行されるIMultitypeインターフェイスのメソッド
AddObject の流れ線図である。図12は、コード表11
に示されたAddObject のコードに対応する。メソッドAd
dObject は、オブジェクトの全てのインターフェイスへ
のマルチタイプオブジェクトアクセスに動的に追加する
ようにクライエントアプリケーションにより使用され
る。このメソッドには、どのリストにオブジェクトを追
加するかを指示するリスト指示子と、オブジェクトを指
定のリストのヘッド又はテイルに追加しなければならな
いかどうかの指示と、集合すべきオブジェクトのIUnkno
wnインターフェイスに対するポインタとが通される。こ
のメソッドは、メソッドAddInterfaceと共に、マルチタ
イプオブジェクトによって囲まれるオブジェクト及びイ
ンターフェイスに関する情報を維持するための構造を実
施する。
クトのインターフェイスを各々指すエレメントで形成さ
れたリスト構造を使用する。全オブジェクトを囲むため
にメソッドAddObject が呼び出されたときには、指定の
リスト構造に新たなエレメントが追加され、新たなエレ
メントは、囲まれたオブジェクトのIUnknownインターフ
ェイスを指す。このIUnknownインターフェイスは、次い
で、囲まれたオブジェクトの成分インターフェイスをア
クセスするのに使用することができる。一方、オブジェ
クトの単一インターフェイスを囲むためにメソッドAddI
nterfaceが呼び出された場合には、指定のリスト構造に
新たなリストエレメントが追加され、この新たなエレメ
ントは、この単一インターフェイスに直接アクセスでき
るようにこの単一インターフェイスを指す。典型的な実
施において、各リストエレメントは、インターフェイス
識別子によって指示され、囲まれたオブジェクトのイン
ターフェイスを指し、そしてそのリスト内の次のエレメ
ントを指す。クライエントはリストのヘッド又はテイル
のいずれかに追加できるので、二重にリンクされたリス
トを用いて効率を上げることができる。
て、クライエントアプリケーションはアプリケーション
が指定のインターフェイス又はオブジェクトを追加した
いのはどのリストかを指定する。「通常」リストは、ク
ライエントアプリケーションがインターフェイス又はオ
ブジェクトを集合に単に追加しようとするときに用いら
れる。「オーバーライド」リスト及び「デフォールト」
リストは、クライエントアプリケーションがインターフ
ェイスを追加しようとし、そのメソッドが通常リストに
おけるものとは異なる時間に呼び出されるときに、使用
される。典型的な実施においては、特定のインターフェ
イスが要求されたときに、マルチタイプオブジェクトの
制御IUnknownのメソッドQueryInterfaceは、要求された
インターフェイスサーチリストを、最初にオーバーライ
ドリストを介して、第2に通常リストを介してそして第
3にデフォールトリストを介して返送する。当業者であ
れば、リスト構造の番号を変え、サーチ順序を変えそし
て要求されたインターフェイスとの一致を何が構成する
かの判断を変えることを含む多数の他の実施及びサーチ
戦略が明らかであろう。以下に述べる好ましい実施例で
は、クライエントアプリケーションは、決定ルールを変
更する。
メントをいかに追加するかを示している。ステップ90
1において、このメソッドは新たなリスト項目を割り当
て、そしてステップ902においてその項目を初期化し
て、クライエントアプリケーションが集合しようとする
インターフェイスを含むオブジェクトのIUnknownインタ
ーフェイスを指すと共に、その項目のインターフェイス
識別子を含むようにする(IUnknownインターフェイスを
指示するために)。ステップ903において、このメソ
ッドは、通常リストが指定されたかどうか判断する。も
しそうならば、このメソッドはステップ904に続き、
さもなくば、ステップ907に続く。ステップ904に
おいて、このメソッドは、クライエントアプリケーショ
ンが通常リストのヘッドにエレメントを挿入しようとし
ているかどうかを判断する。もしそうならば、メソッド
はステップ905に続き、さもなくば、ステップ906
に続く。ステップ905では、このメソッドは、初期化
されたエレメントを通常リストのヘッドに挿入し、そし
て復帰する。ステップ906では、初期化されたエレメ
ントを通常リストのテイルに挿入しそして復帰する。ス
テップ907ないし914は、オーバーライド及びデフ
ォールトリストについて同様に作用する。
dInterfaceは、メソッドAddObjectと同様に機能する。
その主たる相違は、追加されたリストエレメントが、囲
まれるべきオブジェクトの指定のIUnknownインターフェ
イスを指すのではなくて、追加されたリストエレメント
が指定のインターフェイスを指しそして通されたインタ
ーフェイス識別子を指示する。このように、オブジェク
トの単一の単一インターフェイスを、他のインターフェ
イスを提示せずに、集合することができる。
ーフェイス(継承されたIUnknownインターフェイス)の
メソッドQueryInterface、AddRef及びRelease は、この
IMultitypeインターフェイスを実施する親オブジェクト
(MTO)のIUnknownインターフェイスに要求を送る。
IUnknownインターフェイスは、メソッドQueryInterfac
e、AddRef及びRelease を含む。メソッドAddRef及びRel
easeは、マルチタイプオブジェクトの参照カウントを実
行する。参照カウントがゼロのときには、MTOオブジ
ェクトが削除される。
する制御IUnknownインターフェイスのメソッドQueryInt
erfaceの流れ線図である。図13は、コード表11に示
されたQueryInterfaceに対するコードに対応する。メソ
ッドQueryInterfaceは、要求されたインターフェイス
を、それ自身の実施についての知識と、集合されたイン
ターフェイスリストからの情報とを用いて位置決めす
る。このメソッドは、要求されたインターフェイス識別
子である入力パラメータを取り上げ、そして要求された
インターフェイスに対するポインタを出力する。ステッ
プ1001ないし1004において、このメソッドは、
要求されたインターフェイスがマルチタイプオブジェク
ト自体によって実施されたものであるかどうかを判断す
る。さもなくば、ステップ1005ないし1014にお
いて、このメソッドは、要求されたインターフェイスを
見つけるまで、各々の囲まれたオブジェクト又はインタ
ーフェイスをサーチする。
は、要求されたインターフェイス識別子がIID IMulti
typeに等価であるかどうかを決定し、もしそうであれ
ば、ステップ1002に続き、さもなくば、ステップ1
003に続く。ステップ1002では、このメソッド
は、オブジェクトMTOにより実施されたIMultitypeの
インスタンスを指すように出力パラメータをセットし、
そして復帰する。ステップ1003では、このメソッド
は、要求されたインターフェイス識別子がIID IUnkno
wnに等価であるかどうかを決定し、もしそうであれば、
ステップ1004に続き、さもなくば、ステップ100
5に続く。ステップ1004では、このメソッドは、マ
ルチタイプオブジェクトによって実施されるIUnknownの
インスタンスであるこのポインタに出力パラメータをセ
ットし、そして復帰する。
のメソッドは、要求されたインターフェイスに一致する
インターフェイスを指す第1のリストエレメントをサー
チするように3つのリストをループする。このインスタ
ンスが見つかったときには、それがパラメータppv にお
いて返送され、そしてこのメソッドは首尾良い状態を返
送する。この実施は、使用できる多数の形式のサーチの
一例に過ぎないことが当業者に明らかであろう。ステッ
プ1005において、一時的なリスト指示子はマルチタ
イプオブジェクトによって実施されるリストの組からの
次のリストにセットされる。好ましい実施例において、
このリストの組は、オーバーライド、通常、及びデフォ
ールトリストを含む。ステップ1006において、この
メソッドは、現在リストの前部を指すように一時的な変
数項目をセットする。ステップ1007において、この
メソッドは、現在リスト内の全てのエレメントを排出し
そして一致インスタンスがまだ見つからないかどうかを
決定する。このメソッドが現在リストの終わりに達した
場合には、この方法はステップ1008に続き、さもな
くば、ステップ1009に続く。ステップ1008にお
いて、このメソッドは、更に多くのリストがサーチに使
用できることを決定すると、ステップ1005に戻っ
て、新たなリストのサーチを開始する。さもなくば、こ
のメソッドは、一致するインターフェイスが見つからな
いので、不首尾の状態を返送する。ステップ1009に
おいて、このメソッドは、一時的な変数pitem によって
指された現在リストエレメントがIUnknownインターフェ
イスを指すかどうか決定し、もしそうならば、ステップ
1010へ続き、さもなくば、ステップ1013へ続
く。(現在リストエレメントがIUnknownインターフェイ
スを指す場合には、このインターフェイスに対応するオ
ブジェクトは、一致インターフェイスのために更に問い
合わせされる必要がある。)ステップ1010におい
て、このメソッドは、現在リストエレメントによって指
されたIUnknownインターフェイスのメソッドQueryInter
faceを呼び出す。ステップ1011において、このメソ
ッドは、要求されたインターフェイス識別子が見つかっ
たかどうか決定し、もしそうでなければ、ステップ10
12へ続き、さもなくば、復帰する。要求されたインタ
ーフェイス識別子が見つからない場合には、QueryInter
faceコールが、返送パラメータppvを、要求されたイン
ターフェイスを指すように既にセットしている。この場
合にこのメソッドは、首尾良い状態を返送する。さもな
くば、ステップ1012において、このメソッドは、リ
スト内の次のエレメントを指すように現在リストエレメ
ントポインタ(pitem) をインクレメントし、そしてステ
ップ1007に続き、現在リスト構造を通してサーチす
る。ステップ1013において、このメソッドは、要求
されたインターフェイス識別子を、現在リストエレメン
トのインターフェイス識別フィールドと比較し、それら
が同じであれば、ステップ1014へ続き、さもなく
ば、サーチを伴うステップ1012へ続く。ステップ1
014ではこのメソッドは、返送パラメータppv を、要
求されたインターフェイスを(現在リストエレメントに
より指された)指すようにセットし、そして首尾良い状
態を復帰する。
インターフェイスがメソッドAddObject を用いて動的に
集合された後の図10に対応するマルチタイプオブジェ
クトのデータ構造レイアウトを示すブロック図である。
データ構造レイアウトは、インスタンスデータ110
1、仮想関数表1104及び1105、メソッド110
7ないし1115、並びに現在囲まれている(集合され
たオブジェクト)のインスタンスを備えている。インス
タンスデータ1101は、制御IUnknownインターフェイ
スに対する仮想関数表のポインタと、クラスMTのイン
スタンス(IMultitypeインターフェイスの実施)である
データメンバ m MTと、MTOオブジェクトのIUnknown
インターフェイスを指すデータメンバ m punkOuter
と、現在追加されたインターフェイスの通常リストのヘ
ッドを指すデータメンバ m pnormal itemheadとを含ん
でいる。図示されたように、リストは現在2つのエレメ
ントを含んでいる。リストエレメント1102は、S1
オブジェクト801ないし823(図11で定義され
た)を指し、そしてリストエレメント1103は、S2
オブジェクト1106のインスタンスを指す。図示され
ていないが、マルチプルオブジェクトは、空のデフォー
ルトリスト及びオーバーライドリストに対するポインタ
も指す。
ときには、そのデータメンバS1:: m punkOuter が、MT
OオブジェクトのIUnknownインターフェイスを指すよう
に初期化される。同様に、囲まれたS2オブジェクトが
具体化されるときには、そのデータメンバS2:: m punk
Outer が、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();
を動的に集合するためのステップの好ましいリストに対
する擬似コードを含んでいる。この例は、オブジェクト
の全てのインターフェイスを追加するためのメソッドAd
dObject を用いて図10に示すIBasic、IPrint及びIDat
abase のインスタンスを追加することに対応する。第1
に、関数CreateInstanceMTO を用いて新たなマルチタイ
プオブジェクトが割り当てられる。この関数を用いる
と、IUnknownインターフェイスが、新たに具体化された
マルチタイプオブジェクトに対し検索される。このイン
ターフェイスは、S1及びS2オブジェクトが、囲んで
いるマルチタイプオブジェクトをアクセスできるように
具体化されたときにこれらS1及びS2オブジェクトに
通される。ある点において、S1オブジェクトのインス
タンスが形成され、マルチタイプオブジェクトに対する
ポインタがそこに通される。又、S2データベースオブ
ジェクトのインスタンスが形成され、マルチタイプオブ
ジェクトに対するポインタがそこに通される。S1及び
S2のインスタンスが形成された後に、IMultitypeイン
ターフェイスがマルチタイプオブジェクトから検索され
る。このインターフェイスは、スプレッドシート及びデ
ータベースインターフェイスをマルチタイプオブジェク
トに動的に追加するのに使用される。次いで、マルチタ
イプオブジェクトのIMultitypeインターフェイスのメソ
ッドAddObject が呼び出されて、S1及びS2オブジェ
クトがマルチタイプオブジェクトへと集合される。これ
らのオブジェクトがマルチタイプオブジェクトに囲まれ
ると、マルチタイプオブジェクトのいずれかのインター
フェイス又はその囲まれたオブジェクトのいずれかを用
いて、集合オブジェクト内の他のインターフェイスをア
クセスすることができる。コード表2は、基本的なスプ
レッドシートオブジェクト(S1)を用いてデータベー
スインターフェイスを検索しそしてこのIDatabase イン
ターフェイスのデータメソッドを呼び出すという例を示
している。 コード表13 class Imultitype: public IUnknown { virtual HRESULT AddObject(ULONGlist,BOOLEAN headoflist, Iunknown*punkobj)=0; virtual HRESULT AddInterface(REFIIDiid,ULONGlist,BOOLEAN headoflist, void*pv)=0; virtual HRESULT AddRule(REFIIDiid,IRule*prule)=0; virtual HRESULT Enum(ULONGi, REFIIDiid,ULONGlist,BOOLEAN headoflist, void*ppv)=0; } class IRule: public IUnknown { virtual HRESULT Init(IMultitype*pMTO)=0; } class MTO: public IUnknown { public: static void CreateInstance(IUnknown*punkOuter,IUnknown**ppunk) { MTO*pMTO=new MTO(punkOuter); pMTO->QueryInterface(IID IUnknown,ppunk);} private: void MTO(IUnknown*punkOuter):m MT(this) { if(punkOuter==NULL) m punkOuter=this; else m punkOuter=punkOuter; pQI=new(MyQI); //QueryInterface をデフォールトルール // にする。 pQI->QueryInterface(IID IRule,prule); m MT->AddRule(IID IUnknown,prule); } class MT: public IMultitype { public: void MT(MTO*pMTO){m pMTO=pMTO } virtual HRESULT QueryInterface(REFIIDiid,void**ppv) {return m pMTO-> m punkOuter-> QueryInterface(iid,ppv);} virtual void AddRef() { m pMTO-> m punkOuter-> AddRef(); } virtual void Release() { m pMTO-> m punkOuter-> Release();} virtual HRESULT AddObject(ULONGlist,BOOLEAN headoflist, IUnknown*punkobj) { item*pitem; pitem=new(item); pitem->iid=IID IUnknown; pitem->pobj=punkobj; pitem->pnext=null pitem->pprev=null; switch(list) { caseNORMAL LIST: //...headoflist=真の場合は、第1項目として通常リ //ストに挿入し、さもなくば、最後の項目として挿入 //する。 caseDEFAULT LIST: //...headoflist=真の場合は、第1項目としてデフォ //ルトリストに挿入し、さもなくば、最後の項目とし //て挿入する。 caseOVERRIDE LIST: //...headoflist=真の場合は、第1項目としてオーバ //ーライドリストに挿入し、さもなくば、最後の項目 //として挿入する。 default: //... 通常リストのヘッドに挿入する。 } } virtual HRESULT AddInterface(REFIILDiid,ULONGlist,BOOLEAN headoflist, void*pv) { ... pitem->iid=iid; pitem->pobj=pv; //AddObjectメソッドと同じコードであるが、リスト項目は // 特定のインターフェイスを指し、IUnknownインターフェ // イスを指さない。 ... } virtual HRESULT AddRule(REFIIDiid,Rule*prule) //このメソッドは、マルチタイプオブジェクトにおけるルールのリ //ストにルールオブジェクトを追加する。 { ruleitem*pruleitem; pruleitem=new(ruleitem); pruleitem->iid=iid; pruleitem->prule=prule; pruleitem->pnext=null; pruleitem->pprev=null; // ルールリストに挿入する。--これを行う1つの方法は、 // ルールを最後の項目として挿入することであり、従って // QueryInterfaceが常に最初である。 ... prule->Init(m pMTO); //マルチタイプオブジェクトにつ //いてのルールを告げる。 } virtual HRESULT Enum(ULONGi,REFIIDiid,ULONGlist,BOOLEAN headoflist, void**ppv) //このメソッドは、リスのヘッド又はテイルで始まる指定リストに //おける指定のiid に対応するエレメントの第i番目の発生を返送 //する。 { int counter=0; item *pitem=null; ruleitem*pruleitem=null; boolean done=FALSE; switch(list) { caseNORMAL LIST: if(headoflist){ pitem=m pMTO->m pnormal itemhead; while((!done)&&(pitem!=null)){ //リストの各項目ごとに、追加されたインターフ //ェイスを項目が指す場合はpobjフィールドを、 //或いは全オブジェクトが追加された場合にはイ //ンターフェイスが存在するかどうかをオブジェ //クトが調べる問合せインターフェイスを比較す //る。 switch(pitem->iid){ caseIID IUnknown: if((pitem->pobj->QueryInterface(iid,ppv) ==TRUE)(counter==i))done=TRUE; else pitem=pitem->pnext; break; default; if((pitem->iid==iid)&&(counter==i)) { done=TRUE; ppv=pitem->pobj; }else pitem=pitem->pnext; break; }}; else { //...テイルから始まり、pitem=pitem //->pprevを用いて後方に作用する; }; break; caseDEFAULT LIST: // 通常リストと同様に機能するが、デフォールトリ // ストを使用する; break; caseOVERRIDE LIST: // 通常リストと同様に機能するが、オーバーライド // リストを使用する; break; caseRESULT LIST: if(headoflist){ pruleitem=m pMTO->m prule itemhead; done=FALSE; while((!done)&&(pruleitem!=null)){ if pruleitem->iid==iid{ ppv=pruleitem->prule; done=TRUE; }else pruleitem=pruleitem->pnext;} }else{ //... テイルから始まり、pruleitem= //pruleitem->pprevを用いて後方に作用する }; break; default: // ヘッドから始めて通常リストと同じステップを使用 } } private: MTO *m pMTO; }; //MTオブジェクトに対するクラス定義の終わり friend MT; MT m MT; public: virtual HRESULT QueryInterface(REFIIDiid,void**ppv) { IRule*prule; ruleitem*pruleitemem; boolean done=TRUE,foundrule=FALSE; switch(iid){ case IID IMultiType: *ppv=&m MT; m punkOuter->AddRef(); break; case IID IUnknown: *ppv=this; AddRef(); break; default: done=FALSE; // 第1の一致するIUnknownインターフェイスに対しルー // ルリストを通してサーチし、それを選択ルールとして // 呼び出して、要求されたインターフェイスに対する組 // み合わせルールをアクセスする pruleitem=m prule itemhead; while((foundrule==FALSE)&&(pruleitem!=null)) { if pruleitem->iid==IID IUnknown{ prule=pruleitem->prule; foundrule=TRUE; }else pruleitem=pruleitem->pnext; } if(foundable){ // そのQueryInterfaceメソッドを得て // コールする prule->QueryInterface(IID IUnknown,pselect); done=pselect->QueryInterface(iid,ppv); } else { //ルールリストにおいて組み合わせルールを見 //つけ、それが存在する場合に返送する。この //コードは、1が与えられない場合はデフォー //ルト選択ルールである。 pruleitem=m prule itemhead; foundrule=FALSE; while((foundrule==FALSE)&&(pruleitem!=null { if pruleitem->iid==iid { prule=pruleitem->prule; foundrule=TRUE; }else pruleitem=pruleitem->pnext; } if(foundrule) { // 要求されたインターフェイス // を見つけ、返送する prule->QueryInterface(iid,ppv); else // 組み合わせルールは存在せず、従って、見 // つかった第1のインターフェイスのみを返 // 送する done=FALSE; // 第1の一致するインターフェイスに対し全 // てのリストを通してサーチする if((m MT->Enum(1,iid,OVERRIDE LIST, true,ppv))==FALSE) {done=TRUE }; else if((m MT->Enum(1,iid,NORMAL LIST true,ppv))==TRUE){done=TRUE }; else if((m MT->Enum(1,iid,DEFAULT LIST true,ppv))==TRUE){done=TRUE }; } break; } return done; } virtual void AddRef() { m refcount++; } virtual void Release(){if(--m refcount==0)delete this;} private: IUnknown *m punkOuter; int m refcount; struct item { REFIID iid; void *pobj; item *pnext; item *pprev }; item *m pnormal itemhead=null,*m pnormal itemtail=null, *m pdefault itemhead=null,*m pdefault itemtail=null, *m poverride itemhead=null,*m poverride itemtail =null, struct ruleitem { REFIIDiid; IRule *prule ruleitem *pnext ruleitem *pprev }; ruleitem *m prule itemhead=null,*m prule itemtail=null; }; //MTO オブジェクトに対するクラス定義の終了 class MyQI: public IUnknown { private: void MyQI: m R(this) {他の初期化コード} class R: public IRule { public: void R(MyQI*pMyQI) {m pMyQI=pMyQI)} //...ここでは、IUnknownメソッドも実施され、これは、囲ん // でいるオブジェクトに対する制御IUnknownメソッド(以下 // に示すpublicメソッド)を呼び出す virtual HRESULT Init(IMultitype*pMTO){ m pMyQI-> m pMTO=pMTO } private: MyQI *m pMyQI; }; // クラスR 定義の終わり friend R; R m R; int m refcount; IMultitype *m pMTO; public: virtual HRESULT QueryInterface(REFIIDiid,void**ppv) { IRule*prule; boolean done=TRUE,FOUNDrule=FALSE; switch(iid){ case IID IRule: *ppv=&m R; AddRef(); break; case IID IUnknown: *ppv=this; AddRef(); break; default: // これは、MTO オブジェクトのリストをい // かにサーチするかを知るIUnknownのデフ // ォールトルールに対するコードと同じで // ある foundrule=m pMTO->Enum(1,iid,RULE LIST,true,prule); if(foundrule) // 要求されたIID に対す // る組み合わせルールを // 返送する {prule->QueryInterface(iid,ppv); } else { // 組み合わせルールは存在せず、 // 従って、見つかった第1のイン // ターフェイスを返送する done=FALSE; // 第1の一致するインターフェイ // スに対し全てのリストをサーチ // する if((m pMTO->Enum(1,iid, OVERRIDE LIST,true,ppv)) ==TRUE) {done=TRUE }; else if((m pMTO->Enum(1,iid, NORMAL LIST,true,ppv))== TRUE) {done=TRUE }; else if((m pMTO->Enum(1,iid, DEFAULT LIST,true,ppv))== TRUE) {done=TRUE }; }; break; }; return done; } virtual void AddRef(){m refcount++; } virtual void Release() {--m refcount==0)delete this;} };
ストをサポートするために増強されたマルチタイプオブ
ジェクトに対する好ましいクラス定義のC++擬似コー
ドを含んでいる。これらのルールオブジェクトは、マル
チタイプオブジェクトの要求されたインターフェイスを
組み合わせるための組み合わせルール、又はルールオブ
ジェクトのリストからルールオブジェクト(組み合わせ
ルールを含む)を選択するための選択ルールのいずれか
を含むことができることを想起されたい。各ルールオブ
ジェクトは、ルールオブジェクトをマルチタイプオブジ
ェクトにフックするためのIRule インターフェイスのイ
ンスタンスを実行する。又、各ルールオブジェクトは、
ルールオブジェクトが組み合わせルールを与えるところ
のインターフェイスのインスタンスも実行する。例え
ば、全ての囲まれた集合されたオブジェクトのプリント
を整合するために、IPrintインターフェイスの組み合わ
せルールを実施するルールオブジェクトを設けることが
できる。このようなルールオブジェクトは、IRule イン
ターフェイスの実施と、IPrintインターフェイスの実施
とを含む。この特定例は、コード表14を参照して以下
に詳細に述べる。
のリストからルールオブジェクトを選択する選択ルール
を含むルールオブジェクトに対する好ましいクラス定義
のC++擬似コードも示している。簡単な例にするため
に、このルールオブジェクトによって与えられるルール
は、ルールオブジェクトのリスト(MTO::QueryInterfac
e により定められた)からルールオブジェクトをアクセ
スするためにマルチタイプオブジェクトによって使用さ
れるデフォールトコードに類似している。しかしなが
ら、この選択ルールオブジェクトは、ルールオブジェク
トをアクセスするためのいかなるルールも実施できるこ
とが当業者に明らかであろう。
オブジェクトは、2つのインターフェイスIMultitype及
びIUnknownを実行する。これらのインターフェイスは、
以下に述べるものを除いて、コード表11に示したもの
と本質的に同じである。コード表13に示されたコード
表11からの基本的な変更は、制御IUnknownのメソッド
QueryInterface(MTO::QueryInterface) が、固定の1組
のルールに基づき一致インターフェイスに対して囲まれ
たインターフェイスの3つのリストをもはやサーチしな
いことである。(図14に示された固定のルールは、オ
ーバーライド、通常及びデフォールトリストから最初に
見つかったインターフェイスをその順序で返送すること
である。)むしろ、MTOオブジェクト自体によって実
施されないインターフェイスが要求されたと決定される
と、MTO::QueryInterface は、その要求されたインター
フェイスに対応するルールオブジェクトがルールオブジ
ェクトのMTOオブジェクトリストに存在する場合はそ
こまで要求を延期する。見つかったルールオブジェクト
は、次いで、要求されたインターフェイスの実施を与え
るか又は集合されたインターフェイスのMTOオブジェ
クトの3つのリストからインターフェイスを返送する役
割を果たす。従って、クライエントアプリケーション
は、特定のインターフェイスを検索するか又は組み合わ
せるそれ自身のルールオブジェクトを設けることによ
り、集合されたオブジェクトの制御IUnknownのメソッド
QueryInterfaceの動作を変更することができる。これら
のルールオブジェクトは、マルチタイプオブジェクトの
実施とは独立して実施できる。というのは、それらは、
囲まれたインターフェイス及びルールリストをアクセス
するためにマルチタイプオブジェクトによって与えられ
たパブリック・エニュメレーションメソッドを使用でき
るからである。更に、クライエントアプリケーション
は、IUnknownインターフェイスに対するルールオブジェ
クトを設けることにより要求されたインターフェイスに
対応するルールオブジェクトを見つけるためにMTO::Que
ryInterface により使用される選択ルールを変更するこ
とができる。
ドAddObject 及びAddInterfaceに加えて、クラスMTO
は、ルールオブジェクトを取り扱うための2つのメソッ
ド、AddRule 及びEnumを与える。メソッドAddRule は、
AddInterfaceと同様に実行される。メソッドAddRule
は、ルールオブジェクトのリストに対して新たなリスト
項目を形成し、そして入力パラメータとして通されたル
ールオブジェクトのインターフェイス識別子及びIRule
インターフェイスを指すようにこの項目を初期化する。
このメソッドは、次いで、ルールオブジェクトのリスト
に新たなリスト項目を挿入し、そしてその新たなリスト
項目により指されたIRule インターフェイスのメソッド
Initを呼び出し、MTOオブジェクトに戻るルールオブ
ジェクトアクセスを与える。このようなアクセスは、イ
ンターフェイスの他のリストをアクセスするためのメソ
ッドEnumを呼び出すようにルールオブジェクトによって
使用される。
ルールオブジェクトのリストの終わりに新たなルールオ
ブジェクトを追加する。更に、ルールオブジェクトのリ
ストを使用するQueryInterfaceメソッドは、インターフ
ェイス識別子当たりルールオブジェクトが1つしかない
と(又は最初に見つかった1つが有効であると)仮定す
る。それ故、あるエラーチェック又は順序制御が好まし
く実行される。他の囲まれたインターフェイスのリスト
と同様に、新たなルールオブジェクトは、リストのヘッ
ド又はテイルのいずれかに挿入することができる。又、
メソッドAddRule は、AddObject 及びAddInterfaceと同
様に新たなルールオブジェクトをどこに追加するかを指
示するパラメータを通すように変更することができる。
或いは、他のリスト項目と同一にルールリスト項目を実
施することができ、そしてメソッドAddInterfaceは、ル
ールオブジェクトをルールオブジェクトのリストに挿入
するのに使用できる。多数の他の技術も考えられ、そし
て抽象的な意味では、ルールオブジェクトも動的に集合
されたオブジェクトであることが当業者に明らかであろ
う。
をサーチしそして検索するメソッドEnumを与える。ルー
ルを組み合わせるためのルールオブジェクトは、このメ
ソッドを使用して、3つの集合されたインターフェイス
リストからインターフェイスを検索することができる。
更に、組み合わせルールを選択するためのルールオブジ
ェクトは、このメソッドを用いて、ルールオブジェクト
のリストからルールオブジェクトIRule インターフェイ
スを検索することができる。図示されたように、メソッ
ドEnumは、指定のリストから要求されたインターフェイ
ス識別子に一致するインターフェイスの第i番目の発生
を返送する。このメソッドは、呼び出しにおいて指定さ
れたリストのヘッド又はテイルからスタートする。別の
実施例では、列挙されるリスト当たり1つづつの4つの
個別のメソッドとして列挙子が実施される。
ストに対し、メソッドEnumは、要求されたインターフェ
イス識別子を見つけるか又はリスト内の項目が尽きるま
で、指定のリストから各リスト項目を検査する。この検
査中に、リスト項目が全オブジェクトを指す場合には、
メソッドEnumは、リスト項目によって指されたオブジェ
クトのメソッドQueryInterfaceを呼び出し、要求された
インターフェイスを潜在的に検索しそして返送する。さ
もなくば、リスト項目がIUnknown以外のインターフェイ
スを指す場合には、リスト項目により指されるインター
フェイス識別子が、要求されたインターフェイス識別子
と直接比較され、それらが一致する場合に、リスト項目
により指されたインターフェイスが返送される。リスト
項目が、一致するインターフェイスを発生しなかった場
合には、このメソッドは、指定のリストの残り部分をサ
ーチしつづける。
ストからサーチしそして検索するための若干異なる動作
を与える。要求されたインターフェイス識別子を返送す
るのではなく、このメソッドは、インターフェイス識別
子を使用して、ルールオブジェクトのリストにおける一
致する項目を見つけ、そして要求されたインターフェイ
ス識別子に対応するルールオブジェクトのIRule インタ
ーフェイスのポインタを返送する。
オブジェクトのメソッドQueryInterfaceは、ルールオブ
ジェクトのリストをサポートするように変更されてい
る。このメソッドは、先ず、入力パラメータで要求され
たインターフェイスがMTOオブジェクト自体により実
施されるかどうかを決定する。もしそうであれば、この
メソッドは、このインターフェイスを返送する。さもな
くば、このメソッドは、選択ルールがルールオブジェク
トのリストに存在する場合にこれを検索して呼び出す。
最後に、選択ルールが存在しない場合には、メソッドQu
eryInterfaceがデフォールト選択コードを与える。
フェイス識別子のもとでルールオブジェクトにリストに
追加される場合に選択ルールを与える。好ましくは、こ
のインターフェイス識別子は、この目的のために指定さ
れる。1つの実施例においては、見つかった第1のこの
ようなルールオブジェクトが選択ルールとして検索され
る。もし存在する場合には、その検索された選択ルール
は、組み合わせルールをサーチしそして検索する役目を
果たし、或いは組み合わせルールが存在しない場合に
は、集合されたインターフェイスの3つのリストからイ
ンターフェイスをサーチしそして検索する。検索された
選択ルールは、そのIUnknownインターフェイスに対して
IUnknownインターフェイス識別子に対応するルールオブ
ジェクトに問い合わせをし(IRule インターフェイスを
用いて)そしてこの検索されたIUnknownインターフェイ
スのメソッドQueryInterfaceを呼び出すことにより、呼
び出される。検索されたIUnknownインターフェイスは、
ルールオブジェクトの制御IUnknownインターフェイスで
あることに注意されたい。
ドMTO::QueryInterface は、デフォールト選択コードを
与える。このデフォールト選択コードは、要求されたイ
ンターフェイスに対する組み合わせルールをそれが存在
する場合に返送するか、又は通常リスト、オーバーライ
ドリスト及びデフォールトリストから見つかった第1の
一致するインターフェイスをその順序で返送する。(デ
フォールト選択コードは、組み合わせルールが存在しな
いときにメソッドMTO::QueryInterface と同様に動作す
る。)組み合わせルールを実施するルールオブジェクト
は、要求されたインターフェイスの実行を与えるか、又
は集合されたインターフェイスのMTOオブジェクトの
3つのリストからインターフェイスを返送する。
クトのリストからルールオブジェクトを選択するための
選択ルールを与えるルールオブジェクトの実施を示して
いる。クラスMyQIは、IRule インターフェイス及びIUnk
nownインターフェイスを実施するルールオブジェクトで
ある。理解を容易にするために、クラスMyQIは、非集合
可能なオブジェクトとして示されている。IRule インタ
ーフェイスは、このルールオブジェクトを含む囲んでい
るマルチタイプオブジェクト(MTO)のポインタを維
持するためのメソッドInitを与える。このMTOポイン
タは、IMultitypeインターフェイスのメソッドEnumをア
クセスするように後で使用され、集合されたインターフ
ェイス及びオブジェクトをアクセスすることができる。
メソッドInitは、ルールオブジェクトのリストにルール
オブジェクトが追加されるときにAddRule によって呼び
出される。IUnknownインターフェイスは、ルールオブジ
ェクトのリストから組み合わせルールオブジェクトをい
かに選択するかを知るQueryInterfaceの実施を与える。
図示されたように、MyQI::QueryInterfaceは、MTO::Que
ryInterface により与えられるものと同一の機能を与え
る。しかしながら、その実施は、MyQI::QueryInterface
がメソッドEnumを用いて組み合わせルールを見つけるの
であって、リスト自体をサーチするのではない点で異な
る。MTO::QueryInterface は同様に実施できることが当
業者に明らかであろう。
ッドMTO::MTOにおいて示される。マルチタイプオブジェ
クトが具体化されるときには、構成子MTO::MTOが呼び出
される。この構成子は、MyQIクラス定義を用いてIUnkno
wnインターフェイスに対する新たなルールオブジェクト
を形成し、次いで、このルールオブジェクトをメソッド
AddRule を用いてルールオブジェクトのリストに追加す
る。選択ルールを実施するルールオブジェクトの追加は
いつでも容易に実行できることが当業者に明らかであろ
う。 コード表14 class IPrint: public IUnknown { virtual boolean Print(void**ppobj)=0; } class myPrintRule:public IUnknown ... private: ... void myPrintRule:m R(this), m P(this) {/*他の初期化コード*/ } class R: public IRule { public: void R(myPrintRule *pmyPrintRule){m pMyRule= pmyPrintRule)} //...ここでは、IUnknownメソッドも実施され、これは、囲ん // でいるオブジェクトに対する制御IUnknownメソッド(以下 // に示すパブリックメソッド)を呼び出す virtual HRESULT Init(IMultitype*pMTO){m pMyRule → m pMTO=pMTO } private: myPrintRule *m pMyRule; }; // クラスR 定義の終わり friend R; R m R; class P: public IPrint { public: void P(myPrintRule*pmyPrintRule) {m pMyRule= pmyPrintRule) } //...ここでは、IUnknownメソッドも実施され、これは、囲ん // でいるオブジェクトに対する制御IUnknownメソッド(以下 // に示すパブリックメソッド)を呼び出す virtual void Print(void*pobj) // オーバーライドリストそして通常リストの順序で各リストにおける // 各集合されたオブジェクトプリントルーチンを呼び出し、そして通 // 常リストにプリントルーチンが存在しない場合にデフォールトリス // トからプリントルーチンのみを呼び出す { IID Imultitype *p iMT; IID IPrint *p iprint; int i,j; p iMT=m pMyRule->m pMTO; for(i=1;p iMT->Enum(i,IID Iprint, OVERRIDE LIST, true,&p iprint); i++)p iprint->Print(pobj); for(j=1;p iMT->Enum(i,IID Iprint, NORMAL LIST, true,&p iprint); j++)p print->Print(pobj); if((i==1)&&(j==1)&&(p iMT->Enum(1,IID IPrint,DEFAULT LIST,true,&p print)))p print->Print(pobj); }; } private: myPrintRule *m pMyRule; }; friend P; P m P; int m refcount; IMultitype *m pMTO; public: ... virtual HRESULT QueryInterface(REFIIDidd,void**ppv) { ret=TRUE; switch(iid){ case IID IPrint: *ppv=&m P; AddRef(); break; case IID IRule: *ppv=&m R; AddRef(); break; case IID IUnknown: *ppv=this; AddRef(); break; ... } return ret; } virtual void AddRef() {m refcount++; } virtual void Release(){if(--m refcount==0)delete this;} };
ト及びルールオブジェクトを用いて1組の集合されたオ
ブジェクト又はインターフェイスに対するオーバーライ
ド動作を与えるC++擬似コードを示している。典型的
に、異なるタイプの1組のオブジェクトが集合されたと
きには、各オブジェクトは、オブジェクトをいかにプリ
ントするかを知るそれ自身のプリントメソッドを与え
る。コード表14は、IPrintインターフェイスの組み合
わせルールを与えるルールオブジェクトの好ましいクラ
ス定義のC++擬似コードを示す。与えられたIPrintイ
ンターフェイスはメソッドPrint を含み、これは、囲ん
でいるマルチタイプオブジェクトにおける各囲まれたオ
ブジェクト又はインターフェイスのプリントメソッドを
呼び出すものである。
ジェクトと同様に、少なくとも2つのインターフェイ
ス、この場合はIRule 及びIPrintに対する実行を与え
る。クラスMyPrintRule によって与えられるIRule イン
ターフェイスは、コード表13を参照して既に述べたク
ラスMyQIと機能的に同一である。IPrintインターフェイ
スは、マルチタイプオブジェクトにおける集合されたオ
ブジェクトの3つのリストを通して列挙する組み合わせ
ルールを単に与えるもので、他のIPrintインターフェイ
スをサーチして、見つかった際にそれらのPrint ルール
を呼び出す。コード表13について述べたように、この
ルールオブジェクトがマルチタイプオブジェクトにおけ
るルールオブジェクトのリストに追加された後に、マル
チタイプオブジェクトの制御IUnknownのメソッドQueryI
nterfaceは、クライエントアプリケーションがその集合
されたオブジェクトにおけるIID IPrintを要求するQu
eryInterfaceを呼び出すときに、この組み合わせルール
IPrintインターフェイスのポインタを返送するのが好ま
しい。その結果、クライエントアプリケーションがメソ
ッドPrint を呼び出すときには、このルールオブジェク
トによって実行されるメソッドPrint が呼び出されて、
その集合されたオブジェクトがその成分を正しくプリン
トするように確保する。 コード表15 pPrintRule=new(myPrintRule); //IPrintインターフェイスを組み合わせル //ールとする pPrintRule->QueryInterface(IID IRule,prule); p MTO->QueryInterface(IID IMultiple,p MT); p MT->AddRule(IID IPrint,prule); // これをMultitype オブジェクト // に追加する
たルールオブジェクトをインストールするコールのC+
+擬似コードシーケンスを示す。先ず、クラスmyPrintR
uleルールオブジェクトの新たなインスタンスが形成さ
れる。第2に、この新たなルールオブジェクトのIRule
インターフェイスが後で使用するように検索される。第
3に、マルチタイプオブジェクト(p MTO)のポインタを
どこからか得た後に、マルチタイプオブジェクトのIMul
titypeインターフェイスが検索される。最終的に、この
検索されたIMultitypeインターフェイスのメソッドAddR
ule が呼び出され、これに、新たなルールオブジェクト
(IID IPrint) に対するインターフェイス識別子及び新
たなルールオブジェクトのIRule インターフェイスを通
す。
クトは、プリントについて説明した同じメカニズムを用
いて永続的に記憶される。特に、マルチタイプオブジェ
クトは、IPersistFileインターフェイス又は他のインタ
ーフェイスに対する組み合わせオブジェクトを与え、こ
れは、オブジェクトをセーブしそして検索する役割を果
たす。(IPersistFileインターフェイスは、オブジェク
トをセーブしそしてロードするメソッドである。)この
ように、マルチタイプオブジェクトは、囲まれたオブジ
ェクト及びインターフェイスのセーブ機能にオーバーラ
イドして、集合された全てのオブジェクトがセーブされ
るように確保する。組み合わせルールはマルチタイプオ
ブジェクトが最初に必要とするデータ構造をセーブし、
そして囲まれたIPersistFileインターフェイス又はオブ
ジェクトの各々においてメソッドSaveを呼び出す。従っ
て、集合オブジェクトをセーブすることに関与するため
に、クライエントプログラムは、囲まれるべきオブジェ
クトのIPersistFileインターフェイスを追加するか、又
は全オブジェクトを囲い込む。個別のファイルに個別の
記憶が必要とされるのではない。マルチタイプオブジェ
クトは、オブジェクトデータを単一のファイル内に記憶
したのと同様の仕方でそれ自身のデータを記憶すること
ができる。
クトとルールの1つのリストのみを実施する(3つのリ
ストとルールオブジェクトのリストではなくて)別の実
施例では、マルチタイプオブジェクトはそれ自身の記憶
を必要としない。集合されたオブジェクトにより使用さ
れるもの以外の記憶は必要でない。というのは、マルチ
タイプオブジェクトは、ハイアラーキ式の永続記憶構造
において集合されたオブジェクトの順序及びインデック
ス情報を検査することにより単一リストを再形成できる
からである。しかしながら、多数のインターフェイスリ
ストを実行するマルチタイプオブジェクトは、どのイン
ターフェイスインスタンスがどのリストによって指され
るかを区別するために情報を記憶することを一般に必要
とする。
wn::QueryInterfaceメソッドが囲まれたオブジェクトの
QueryInterfaceメソッドを呼び出すときに、このような
呼び出しが同期しておこなわれると仮定する。即ち、囲
まれたオブジェクトQueryInterfaceメソッドは、制御IU
nknown::QueryInterfaceメソッドが次の囲まれたオブジ
ェクトQueryInterfaceメソッドを呼び出す前に復帰す
る。別の実施例では、制御IUnknown::QueryInterfaceメ
ソッドは、囲まれたオブジェクトQueryInterfaceメソッ
ドを、それらの復帰を待機せずに非同期で呼び出す。む
しろ、標準的なプロセス間通信メカニズムを用いて、囲
まれたオブジェクトメソッドが完了したときに制御ルー
チンを知らせる。このような実施例は、ネットワーク又
はマルチプロセッサ環境において有用である。
リケーションは、動的な集合の知識で開発されたプログ
ラムを用いてユーザがオブジェクトのインスタンスを更
に強力なオブジェクトへと組み合わせることである。例
えば、背景技術で説明したスプレッドシートインターフ
ェイスの例を用いて、ソフトウェアの販売者がスプレッ
ドシート製品を出荷し、そこからユーザがスプレッドシ
ートの基本的な操作に対しIBasicインターフェイスのみ
をサポートする集合可能なスプレッドシートオブジェク
トを形成できると仮定する。(即ち、この製品を用い
て、ユーザは、スプレッドシートオブジェクトであるIB
asicインターフェイスのインスタンスを形成することが
できる。)更に、別のソフトウェア販売者がデータベー
ス製品を出荷し、そこからユーザが集合可能なデータベ
ース問合せオブジェクトを形成できると仮定する。これ
らの集合可能なデータベース問合せオブジェクトは、ID
atabaseQueryインターフェイスをサポートし、これは、
例えば、問合せを実行するメソッドDoQuery と、ユーザ
が問合せを指定できるようにするメソッドDefineQuery
とを備えている。入力データとして働くことのできる他
のオブジェクトに取り付けられたときに、これらのデー
タベース問合せオブジェクトは、その取り付けられた入
力データに問い合わせをするように呼び出すことができ
る。又、コンピュータシステム上にプログラムが常駐
し、例えば、オブジェクトをマネージしそしてマルチタ
イプオブジェクトをいかに形成し他のオブジェクト及び
インターフェイスを一緒に集合するかを知るファイルマ
ネージャが常駐すると仮定する。このタスクを行うため
に、ファイルマネージャは、IMultitypeインターフェイ
スの実行を与えるマルチタイプオブジェクトをいかに形
成するかを知る。
合せオブジェクトを形成するように一緒に集合すること
のできるスプレッドシートオブジェクト及びデータベー
ス問合せオブジェクトを示す図である。指定されたデー
タベースにおいて指定された問合せを実行することので
きる更に強力なオブジェクト(取り付けられたデータベ
ース問合せオブジェクト1205)を形成するために、
ユーザは、先ず、スプレッドシート製品を用いて、ユー
ザが入力データとして使用しようとするスプレッドシー
トオブジェクト1201のインスタンスを形成する。次
いで、ユーザは、データベース製品を用いて、データベ
ース問合せオブジェクト1202のインスタンスを形成
する。次いで、ユーザは、定義ボタン1204を押すこ
とによりIDatabaseQueryインターフェイスのメソッドDe
fineQuery を呼び出し、そしてデータベース言語、例え
ば、SQL言語を用いてデータベース問合せに対するテ
キストを入力する。次いで、ユーザは、ファイルマネー
ジャ1208を呼び出す。このファイルマネージャを用
いて、ユーザは、スプレッドシートオブジェクト120
1及びデータベース問合せオブジェクト1202を選択
し、ファイルマネージャ1208がそれらを集合するこ
とを要求する。ユーザは、例えば、スプレッドシートオ
ブジェクト1201のディスプレイ表示をデータベース
問合せオブジェクト1202のディスプレイ表示のデー
タ入力ポート1203にドラグ及びドロップすることに
より、この要求を指示することができる。ユーザの要求
に応答して、ファイルマネージャ1208は、囲んでい
るマルチタイプオブジェクトを具体化しそしてスプレッ
ドシートオブジェクト1201及びデータベース問合せ
オブジェクト1202の両方に対してメソッドIMultity
pe::AddObject を呼び出すことにより、新たに取り付け
られたデータベース問合せオブジェクト1205を具体
化する。又、ファイルマネージャ1208は、スプレッ
ドシートオブジェクト1201及びデータベース問合せ
オブジェクト1202の両方に、この新たに具体化され
たマルチタイプオブジェクトの制御IUnknownインターフ
ェイスのポインタを通す。次いで、ユーザは、"Go"ボタ
ン1206を選択することによりその取り付けられたデ
ータベース問合せオブジェクトを呼び出して、その取り
付けられたスプレッドシートデータにおいて指定の問合
せを実行することができる。
んでいるオブジェクトのルールがそれに適用されること
が当業者に明らかであろう。従って、スプレッドシート
オブジェクト1201及びデータベース問合せオブジェ
クトの動作は、いったん囲まれると、変更し得る。
タベース問合せオブジェクトを示すブロック図である。
集合されたオブジェクト1304は、図15を参照して
述べた取り付けられたデータベース問合せオブジェクト
に対応する。集合されたオブジェクト1304は、マル
チタイプオブジェクト1301と、スプレッドシートオ
ブジェクト1302と、データベース問合せオブジェク
ト1303とを備えている。マルチタイプオブジェクト
1301は、上記のように、ユーザ要求に応答して、ス
プレッドシートオブジェクト1302及びデータベース
問合せオブジェクト1303を集合するように形成され
る。集合のプロセス中に、マルチタイプオブジェクト
は、集合されたオブジェクトに対するポインタ1305
及び1306を形成し、そして集合されるべきオブジェ
クトに、制御IUnknownインターフェイスに対するポイン
タを通す。その後に、ユーザが"Go"ボタン(図15の1
206)を押したときに、マルチタイプオブジェクト1
307の制御IUnknownインターフェイスが呼び出され、
上記実施例を用いてデータベース問合せオブジェクト1
303のIDatabaseQueryインターフェイスのメソッドDo
Query を呼び出す。メソッドDoQuery は、次いで、メソ
ッドQueryInterfaceを用いてスプレッドシートオブジェ
クト1302の(既知の)所望のインターフェイス識別
子をサーチすることによりスプレッドシートオブジェク
ト1302の(既知の)所望のメソッドに問合せしそし
て呼び出す。(再呼び出しのために、メソッドQueryInt
erfaceの呼び出しは、制御IUnknown1307のメソッド
QueryInterfaceにマルチタイプオブジェクト1301を
送り、これは、もし存在すれば所望のインターフェイス
を位置決めする。)従って、データベース問合せオブジ
ェクト1303は、メソッド及びインターフェイス識別
子の名前(及びパラメータ)が分かる限り、スプレッド
シートオブジェクト1302のインターフェイスのコン
パイル時間定義をアクセスする必要なく、スプレッドシ
ートオブジェクト1302のメソッドを呼び出すことが
できる。
明したが、本発明は、これらの実施例に限定されるもの
ではない。当業者であれば、本発明の範囲内で変更がな
され得ることが明らかであろう本発明の範囲は、特許請
求の範囲のみによって限定されるものとする。
なデータ構造を示すブロック図である。
ェクトのサンプルデータ構造を示すブロック図である。
ータ構造レイアウトを示すブロック図である。
ウトを示すブロック図である。
トとの間の協働を示すブロック図である。
トとの間の協働を示すブロック図である。
トに加えるシーケンスを示すブロック図である。
トに加えるシーケンスを示すブロック図である。
クトに加えるシーケンスを示すブロック図である。
データ構造レイアウトを示すブロック図である。
るIMultitypeインターフェイスのメソッドAddInterface
を示すフローチャートである。
nownインターフェイスのメソッドQueryInterfaceを示す
フローチャートである。
及びIDatabase インターフェイスが動的に集合された後
の図10に対応するマルチタイプオブジェクトのデータ
構造レイアウトを示すブロック図である。
クトを形成するように一緒に集合することのできるスプ
レッドシートオブジェクト及びデータベース問合せオブ
ジェクトを示す図である。
オブジェクトを示すブロック図である。
Claims (16)
- 【請求項1】 オブジェクトにインターフェイスを追加
するためのコンピュータシステムにおける方法であっ
て、オブジェクトにより実現されるインターフェイス
を、囲んでいるオブジェクトに囲い込みできるような方
法において、 上記囲んでいるオブジェクトのインスタンスを形成し、
上記囲んでいるオブジェクトは、その囲んでいるオブジ
ェクトにインターフェイスを追加するための追加インタ
ーフェイス関数メンバと、追加されたインターフェイス
に対する参照を検索するための問合せ関数メンバとを有
し、 上記囲んでいるオブジェクト内に囲い込まれるべきオブ
ジェクトのインスタンスを形成し、上記囲んでいるオブ
ジェクトに対する参照を通し、上記囲い込まれるべきオ
ブジェクトは、インターフェイスを有すると共に、その
インターフェイスに対する参照を検索するための問合せ
関数メンバを有し、そして上記囲んでいるオブジェクト
の追加インターフェイス関数メンバを呼び出し、囲い込
まれるべきオブジェクトに対する参照を通すことによ
り、オブジェクトを囲むと共に、その囲まれたオブジェ
クトのインターフェイスを上記囲んでいるオブジェクト
に追加し、これにより、上記囲んでいるオブジェクトの
問合せ関数メンバが呼び出されたときに、上記囲んでい
るオブジェクトの問合せ関数メンバがその囲まれたオブ
ジェクトの追加されたインターフェイスに対する参照を
返送する、という段階を備えたことを特徴とする方法。 - 【請求項2】 上記囲んでいるオブジェクトの問合せ関
数メンバの呼び出しは、非同期で行われる請求項1に記
載の方法。 - 【請求項3】 上記囲んでいるオブジェクトの問合せ関
数メンバの呼び出しは、同期して行われる請求項1に記
載の方法。 - 【請求項4】 上記囲んでいるオブジェクトは、デフォ
ールトインターフェイスを与える請求項1に記載の方
法。 - 【請求項5】 上記囲んでいるオブジェクトは、囲まれ
たオブジェクトの追加されたインターフェイスをオーバ
ーライドするインターフェイスを与える請求項1に記載
の方法。 - 【請求項6】 上記の囲んでいるオブジェクトは、囲ま
れたオブジェクトによって提示されるインターフェイス
についての知識をもたない請求項1に記載の方法。 - 【請求項7】 上記コンピュータシステムは、永続記憶
のための装置を有しそして更に、 オブジェクトを上記囲んでいるオブジェクトの中に囲い
込んで、集合オブジェクトを形成した後に、その集合オ
ブジェクトを上記永続記憶装置に記憶し、 その記憶された集合オブジェクトを上記永続記憶装置か
らその後にロードするという段階を更に備えた請求項1
に記載の方法。 - 【請求項8】 上記囲んでいるオブジェクトの中に囲い
込まれるべき第2のオブジェクトのインスタンスを形成
し、これにより、上記囲んでいるオブジェクトに対する
参照をこの第2のオブジェクトに通し、この第2のオブ
ジェクトは、提示されたインターフェイスを有し、そし
て上記囲んでいるオブジェクトの追加インターフェイス
関数メンバを呼び出し、上記第2オブジェクトの提示さ
れたインターフェイスを上記囲んでいるオブジェクトに
追加することにより、上記第2オブジェクトを囲い込
み、これにより、囲まれた第1オブジェクトの問合せ関
数メンバが呼び出されたときに、その囲まれた第1オブ
ジェクトの問合せ関数メンバが上記囲まれた第2オブジ
ェクトの追加され提示されたインターフェイスに対する
参照を返送する、という段階を更に備えた請求項1に記
載の方法。 - 【請求項9】 上記囲まれた第2オブジェクトの提示さ
れたインターフェイスは、上記囲まれた第1オブジェク
トのインターフェイスをオーバーライドする請求項8に
記載の方法。 - 【請求項10】 上記囲まれた第2オブジェクトの提示
されたインターフェイスは、上記囲まれた第1オブジェ
クトのインターフェイスを呼び出す請求項8に記載の方
法。 - 【請求項11】 上記囲まれた第2オブジェクトの提示
されたインターフェイスは、デフォールトインターフェ
イスである請求項8に記載の方法。 - 【請求項12】 上記囲まれた第1オブジェクトは、上
記囲んでいるオブジェクトに対するポインタを含み、上
記第2オブジェクトは、その第2オブジェクトの提示さ
れたインターフェイスに対する参照を検索するための問
合せ関数メンバを有し、そして更に、 第1に、上記囲まれた第1オブジェクトの問合せ関数メ
ンバを呼び出して、第2オブジェクトの提示されたイン
ターフェイスを要求し、 第2に、上記囲まれた第1オブジェクトにより含まれた
上記囲んでいるオブジェクトのポインタを介して上記囲
んでいるオブジェクトの問合せ関数メンバに対する参照
を検索し、 第3に、上記囲んでいるオブジェクトの問合せ関数メン
バを呼び出し、上記要求されたインターフェイスを通
し、 第4に、上記囲んでいるオブジェクトの問合せ関数メン
バから、上記囲まれた第2オブジェクトの問合せ関数メ
ンバを呼び出し、上記要求されたインターフェイスを通
し、そして第5に、上記囲まれた第2オブジェクトの問
合せ関数メンバから、上記要求されたインターフェイス
に対する参照を返送する、という段階を更に備えた請求
項8に記載の方法。 - 【請求項13】 上記囲んでいるオブジェクトは、どの
追加インターフェイスに対して参照を検索するかを決定
するためのルールを追加する追加ルール関数メンバを有
し、そして更に、どの追加インターフェイスに対して参
照を検索するかを決定するルールを追加するために上記
囲んでいるオブジェクトの追加ルール関数メンバを呼び
出し、これにより、上記囲んでいるオブジェクトの問合
せ関数メンバが呼び出されたときに、その問合せ関数メ
ンバが、その追加されたルールから、どの追加インター
フェイスに参照を返送するかを決定するという段階を更
に備えた請求項8に記載の方法。 - 【請求項14】 上記方法は言語的に独立している請求
項8に記載の方法。 - 【請求項15】 要求されたインターフェイスに対する
参照を検索するために上記囲んでいるオブジェクトの問
合せ関数メンバを呼び出し、これにより、上記囲んでい
るオブジェクトの問合せ関数メンバが、追加されたルー
ルを用いて、どのインターフェイスインスタンスに参照
を返送するかを決定するという段階を更に備えた請求項
8に記載の方法。 - 【請求項16】 オブジェクトにインターフェイスを追
加するためのコンピュータシステムにおいて、 囲んでいるオブジェクトを備え、該囲んでいるオブジェ
クトは、これにインターフェイスを追加するための追加
インターフェイス関数メンバと、追加されたインターフ
ェイスに対する参照を検索するための問合せ関数メンバ
とを有し、 更に、上記囲んでいるオブジェクト内に囲まれるべきオ
ブジェクトを備え、この囲まれるべきオブジェクトは、
インターフェイスと、該インターフェイスに対する参照
を検索するための問合せ関数メンバとを有し、上記オブ
ジェクトは囲い込まれ、そして上記囲んでいるオブジェ
クトの追加インターフェイス関数メンバを呼び出すこと
により追加されたインターフェイスは、囲まれるべきオ
ブジェクトに対する参照をそこに通し、これにより、オ
ブジェクトが囲まれた後に上記囲んでいるオブジェクト
の問合せインターフェイス関数メンバが呼び出されたと
きには、この問合せインターフェイス関数メンバがその
囲まれたオブジェクトの追加されたインターフェイスに
対する参照を返送することを特徴とするコンピュータシ
ステム。
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 true JPH0836493A (ja) | 1996-02-06 |
JP4322967B2 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 |
---|---|---|---|---|
EP0578207B1 (en) * | 1992-07-06 | 1999-12-01 | Microsoft Corporation | Method for naming and binding 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 |
US6449659B1 (en) * | 1997-07-14 | 2002-09-10 | Microsoft Corporation | System for instance customization with application independent programming of controls |
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 |
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 |
DE69728766T2 (de) * | 1997-10-27 | 2005-03-31 | Sony Service Center (Europe) N.V. | 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 |
US6988271B2 (en) * | 1998-10-02 | 2006-01-17 | Microsoft Corporation | Heavyweight and lightweight instrumentation |
US7039919B1 (en) * | 1998-10-02 | 2006-05-02 | Microsoft Corporation | Tools and techniques for instrumenting interfaces of units of a software program |
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 |
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 |
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 |
US6606613B1 (en) | 1999-06-03 | 2003-08-12 | Microsoft Corporation | Methods and apparatus for using task models to help computer users complete tasks |
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 |
US6915289B1 (en) | 2000-05-04 | 2005-07-05 | International Business Machines Corporation | Using an index to access a subject multi-dimensional database |
US7269786B1 (en) * | 2000-05-04 | 2007-09-11 | International Business Machines Corporation | Navigating 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 |
US20030145310A1 (en) * | 2001-10-31 | 2003-07-31 | Metacyber. Net. | Computer memory structure for storing original source information and associated interpretative information |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
US7730073B2 (en) * | 2003-10-23 | 2010-06-01 | Microsoft Corporation | System and a method for presenting related items to a user |
US7685563B2 (en) * | 2004-03-01 | 2010-03-23 | Microsoft Corporation | Reusable customized project system |
US20050229186A1 (en) * | 2004-03-15 | 2005-10-13 | Canyonbridge, Inc. | Method and apparatus for dynamic runtime object aggregation |
US7805523B2 (en) * | 2004-03-15 | 2010-09-28 | Mitchell David C | Method and apparatus for partial updating of client interfaces |
US8572221B2 (en) | 2004-05-26 | 2013-10-29 | Facebook, Inc. | System and method for managing an online social network |
US7761863B2 (en) * | 2004-06-08 | 2010-07-20 | Covia Labs, Inc. | Method system and data structure for content renditioning adaptation and interoperability segmentation model |
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 |
US8893111B2 (en) | 2006-03-31 | 2014-11-18 | The Invention Science Fund I, Llc | Event evaluation using extrinsic state information |
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 |
CN103443763B (zh) * | 2012-08-08 | 2016-10-05 | 英特尔公司 | 包含对重写虚拟函数的调用的支持的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 |
EP0578207B1 (en) * | 1992-07-06 | 1999-12-01 | Microsoft Corporation | Method for naming and binding objects |
WO1994011810A1 (en) * | 1992-11-13 | 1994-05-26 | Microsoft Corporation | A method and system for marshalling interface pointers for remote procedure calls |
CA2113417C (en) * | 1992-12-24 | 2000-02-22 | C. Douglas Hodges | Method and system for aggregating objects |
US5805885A (en) | 1992-12-24 | 1998-09-08 | Microsoft Corporation | 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 DE DE69533530T patent/DE69533530T2/de 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 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/480,465 patent/US5745764A/en not_active Expired - Lifetime
- 1995-06-07 US US08/475,353 patent/US5710925A/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 |
---|---|
US5745764A (en) | 1998-04-28 |
EP1505493A3 (en) | 2005-02-23 |
US5805885A (en) | 1998-09-08 |
US6526454B2 (en) | 2003-02-25 |
EP0664510B1 (en) | 2004-09-22 |
US6243764B1 (en) | 2001-06-05 |
CA2140166A1 (en) | 1995-07-25 |
JP4322967B2 (ja) | 2009-09-02 |
US6240465B1 (en) | 2001-05-29 |
EP1505493A2 (en) | 2005-02-09 |
EP1505495A2 (en) | 2005-02-09 |
US20020040410A1 (en) | 2002-04-04 |
US5710925A (en) | 1998-01-20 |
US6412020B1 (en) | 2002-06-25 |
CA2140166C (en) | 2004-01-06 |
DE69533530T2 (de) | 2005-09-29 |
EP1505495A3 (en) | 2005-02-23 |
EP0664510A2 (en) | 1995-07-26 |
DE69533530D1 (de) | 2004-10-28 |
EP0664510A3 (en) | 1997-01-15 |
EP1505494A1 (en) | 2005-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JPH0836493A (ja) | オブジェクト集合方法及びシステム | |
US5842018A (en) | Method and system for referring to and binding to objects using identifier objects | |
US7219329B2 (en) | Systems and methods providing lightweight runtime code generation | |
EP0669020B1 (en) | Methods for marshalling interface pointers for remote procedure calls | |
US8327263B2 (en) | Method and system for caching presentation data | |
USRE39285E1 (en) | Method and system for dynamically generating object connections | |
US5515536A (en) | Method and system for invoking methods of an object through a dispatching interface | |
US5842220A (en) | Methods and apparatus for exposing members of an object class through class signature interfaces | |
EP0817101A2 (en) | Method and system for uniformly accessing multiple directory services | |
US7496926B2 (en) | Method and apparatus to encapsulate a queue in a namespace | |
US6708196B1 (en) | Method and system for caching presentation data | |
US6209040B1 (en) | Method and system for interfacing to a type library | |
US6952706B2 (en) | Method for providing stand-in objects | |
CA2113417C (en) | Method and system for aggregating objects |
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 |