JPH06282433A - オブジェクト集合方法およびシステム - Google Patents

オブジェクト集合方法およびシステム

Info

Publication number
JPH06282433A
JPH06282433A JP5328114A JP32811493A JPH06282433A JP H06282433 A JPH06282433 A JP H06282433A JP 5328114 A JP5328114 A JP 5328114A JP 32811493 A JP32811493 A JP 32811493A JP H06282433 A JPH06282433 A JP H06282433A
Authority
JP
Japan
Prior art keywords
interface
member function
enclosed
enclosing
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
Application number
JP5328114A
Other languages
English (en)
Other versions
JP3672334B2 (ja
Inventor
C Douglas Hodges
ダグラス ホッジス シー
Srinivasa R Koppolu
アール コッポル スリニヴァサ
Barry B Mackichan
ビー マッキカン バリー
Craig Wittenberg
ウィッテンバーグ クレイグ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Original Assignee
Microsoft Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microsoft Corp filed Critical Microsoft Corp
Publication of JPH06282433A publication Critical patent/JPH06282433A/ja
Application granted granted Critical
Publication of JP3672334B2 publication Critical patent/JP3672334B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Making Paper Articles (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Organic Low-Molecular-Weight Compounds And Preparation Thereof (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

(57)【要約】 (修正有) 【目的】 所望のコードを共用する際の手続きを簡潔に
する。 【構成】 囲んでいるオブジェクト内に囲まれたオブジ
ェクトを集合させる場合、囲んでいるオブジェクトのイ
ンスタンスを作成し、囲んでいるオブジェクトの制御オ
ブジェクト管理インタフェースの質問メンバ関数が囲ん
でいるオブジェクトによって提示された外部インタフェ
ースの識別子を受け取って外部インタフェースに対する
参照を戻し、更に、囲まれたオブジェクトのインスタン
スを作成し、囲まれたオブジェクトの外部インタフェー
スの質問メンバ関数がインタフェース識別子を受取り、
囲んでいるオブジェクトの制御オブジェクト管理インタ
フェースの質問メンバ関数を呼び出し、囲んでいるオブ
ジェクトの制御オブジェクト管理インタフェースの中か
ら呼び出された質問メンバ関数によって戻される参照を
識別済みインタフェースの参照として戻す。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、一般にコンピュータに
おいてオブジェクトに対する干渉を実行する方法および
システムに関し、特に、オブジェクトを集合させる方法
に関する。
【0002】
【従来の技術】コンピュータソフトウェアシステムが複
雑になるにつれ、ソフトウェアを開発するためのコスト
も増加している。ソフトウェア開発コストを最小限にす
るために、開発者らはコードを共用することが多い。従
来の開発技術では、3つのタイプのコードを共用する。
すなわち、(1)ソースコードの共用、(2)コンパイ
ル済コードの共用、(3)継承中のコード共用、であ
る。ソースコードおよびコンパイル済コードを共用する
方法は、長年広く使用されてきた。ソースコードの共用
とは、さまざまなコンピュータプログラムまたは同一の
コンピュータプログラムのさまざまなバージョンで同一
のコードを使用することである。例えば、一般にスプレ
ッドシートプログラムは、スップレッドシート表示を制
御するソースコードを含む。ワードプロセッシングプロ
グラムでスプレッドシートを文章内に埋め込むことがで
きれば、そのワードプロセッシングプログラムは同一の
(またはわずかに修正した)ソースコードを使用して、
埋め込んだスプレッドシートオブジェクトを表示するこ
とができる。ソースコードは、一般に単独の開発者が複
数のコンピュータプログラムを開発する際に共用され
る。他者と競争する関係上、開発者は他の開発者とコー
ドを共用しない。さらに、コードを共用する場合でさ
え、ソースコード受信者はソースコードを修正するのが
一般的であり、この結果、ソースコードに対し2つのバ
ージョンが維持されることになる。
【0003】コンパイル済コードの共用とは、さまざま
なコンピュータプログラムで同一のコンパイル済コード
を使用することである。一般に、コンパイル済コードは
静的リンクライブラリまたは動的リンクライブラリに格
納される。静的リンクライブラリに格納されたコード
は、実行前にコンピュータプログラムを連係した場合に
共用される。例えば、スペルチェックプログラムの開発
者は、そのプログラムをコンパイルして静的リンクライ
ブラリにコンパイル済コードを格納することによってコ
ンパイル済コードを共用できる。その後、静的リンクラ
イブラリをワードプロセッシングプログラム開発者に分
散することによって、これらの開発者はコンパイル済ス
ペルチェックコードをそれぞれのワードプロセッシング
プログラムに連係することができる。一般に、スペルチ
ェックプログラム開発者は、コンパイル済コード修正し
て、特定開発者の特殊な要求に応じなければならない。
こうした修正によって、コンパイル済コードの複雑化
(とサイズの増大)を助長するだけでなく、他の受信者
の要求と矛盾する可能性もある。他に、開発者が、静的
リンクライブラリの複数のバージョンを分散することも
考えられる。しかし複数のバージョンを保守するにはコ
ストがかかりかねない。
【0004】オブジェクト指向プログラミング技術に
は、継承という概念があり、コードの共用を許容するこ
とを意味する。この継承という概念を理解するには、一
般に、オブジェクト指向プログラム技術を理解すること
が有益である。オブジェクト指向プログラミング言語で
は、データのカプセル化とデータ型の継承を支援すると
いう2つの特徴が一般に知られている。データのカプセ
ル化とは、関数とデータを結合させることである。継承
は、あるデータ型を別のデータ型で宣言することであ
る。C++言語では、オブジェクト指向言語をクラスを
使用して支援する。クラスはユーザが定義した型であ
る。クラスの宣言によって、クラスのデータメンバとメ
ンバ関数が定義される。例えば、下記の宣言はCIRCLEと
いうクラスのデータメンバとメンバ関数とを定義する。 変数xおよびyは、円の中心座標を指定し、変数radius
はその円の半径を指定する。これらの変数をクラスCIRC
LEのデータメンバという。関数drawは、ユーザが定義し
た関数で、指定座標から指定した半径で円を描く。この
関数drawをクラスCIRCLEのメンバ関数という。あるクラ
スのデータメンバとメンバ関数を結合させると、関数が
クラスのインスタンスで動作する。クラスのインスタン
スは、クラスのオブジェクトとも呼ばれる。
【0005】C++の構文では、下記のステートメント
が、オブジェクトaおよびbがクラスCIRCLE型であるこ
とを宣言する。 CIRCLE a, b; この宣言は、オブジェクトaおよびbにメモリを割り当
てる。下記のステートメントは、オブジェクトaおよび
bのデータメンバにデータを割り当てる。 a. x =2; a. y =2; a. radius =1; b. x =4; b. y =5; b. radius =2; 下記のステートメントは、オブジェクトaおよびbによ
って定義される円を描く際に用いられる。 a. draw(); b. draw(); 導出クラスは、その基本クラスの特性、すなわちデータ
メンバとメンバ関数を継承するクラスである。例えば、
下記の導出クラスCIRCLE FILLは、基本クラスCIRCLEを
継承する。
【0006】 この宣言によって、クラスCIRCLE FILLが、クラスCIRC
LE FILLの宣言時に導入したデータメンバとメンバ関数
の他に、クラスCIRCLEに存在するすべてのデータメンバ
とメンバ関数、つまり、データメンバ patternとメンバ
関数fillを含むことを指定する。ここでは、クラスCIRC
LE FILLがデータメンバx、y、radiusならびにメンバ
関数drawおよびfillを有している。この時、クラスCIRC
LE FILLは、クラスCIRCLEの特性を「継承する」と言
う。他のクラスの特性を継承するクラスが、導出クラス
(CIRCLE FILLなど)である。他のクラスの特性を継承
しないクラスを一次クラス(ルートクラス)という(CI
RCLEなど)。他クラスによって特性が継承されるクラス
は、基本クラスである(例えば、CIRCLEは、CIRCLE FILL
の基本クラスである)。導出クラスは、複数のクラス特
性を継承することができる。つまり、導出クラスは複数
の基本クラスを有することができる。これを多重継承と
いう。
【0007】導出クラスは、基本クラスが仮想的に継承
されるものであることを指定することができる。基本ク
ラスの仮想継承とは、仮想基本クラスのインスタンスが
導出クラス中の1つしか存在しないことを意味する。例
えば、下記は非仮想基本クラスを有する導出クラスの1
例である。 class CIRCLE 1 : CIRCLE { , , ,}; class CIRCLE 2 : CIRCLE { , , ,}; class PATTERN : CIRCLE 1, CIRCLE 2 { , ,
,}; この宣言では、クラスPATTERN は非仮想的に2度クラス
CIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継
承する。つまり、クラスPATTERN にはクラスCIRCLEのイ
ンスタンスが2つ存在するのである。下記は、2つの仮
想基本クラスを有する導出クラスの1例である。 class CIRCLE 1 : virtual CIRCLE { , , ,}; class CIRCLE 2 : virtual CIRCLE { , , ,}; class PATTERN : CIRCLE 1, CIRCLE 2 { , ,
,}; 導出クラスPATTERN は、仮想的に2度クラスCIRCLE 1
およびCIRCLE 2 によってクラスCIRCLEを継承する。ク
ラスCIRCLEは、2度仮想的に継承されるので、導出クラ
スPATTERN には、クラスCIRCLEのオブジェクトが1つし
か存在しないことになる。クラス導出が複雑な場合に、
仮想継承が非常に有益であると評価する当業者もいるで
あろう。
【0008】クラスは、そのメンバ関数仮想的であるか
どうかによっても指定することができる。あるメンバ関
数が仮想的であると宣言することは、その関数が導出ク
ラスにおいて同一名および同一型の関数によって優先さ
れ得ることを意味する。下記の例では、関数drawをクラ
スCIRCLEとCIRCLE FILLで仮想的であると宣言してい
る。 C言語は、ポインタデータ型を提供する。ポインタはメ
モリ中のオブジェクトのアドレス値を保持する。ポイン
タを介在に、オブジェクトに参照を付することができ
る。下記のステートメントは、変数 c ptr がクラスCI
RCLE型のオブジェクトのポインタであることを宣言し、
変数 c ptr をセットしてオブジェクトのアドレスを保
持する。
【0009】CIRCLE *c ptr c ptr = &c; この例に続き、下記のステートメントは、オブジェクト
aがクラスCIRCLE型であり、オブジェクトbがクラスCI
RCLE 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::dr
awである。
【0010】図1は、オブジェクトの表現に使用する一
般的なデータ構造を示すブロック図である。オブジェク
トはインスタンスデータ(データメンバ)およびメンバ
関数であり、オブジェクトを実際に動作させる。オブジ
ェクトの表現に使用するデータ構造は、インスタンスデ
ータ構造101と、仮想関数表102と、メンバ関数1
03、104および105から成る。インスタンスデー
タ構造101は、仮想関数表102に対するポインタと
データメンバを含む。仮想関数表102は、オブジェク
トに対して定義した各仮想メンバ関数のエントリを含
む。各エントリは、対応するメンバ関数を提供するコー
ドへの参照を含む。このサンプルオブジェクトのレイア
ウトは、米国特許出願第07/682,537 号「A Methodfor
Implementing Virtual Function and Virtual Bases in
a Compiler for anObject Oriented Programming Lang
uage」に従っており、本明細書中に参照として取り入れ
た。以下において、オブジェクトを、C++プログラミ
ング言語で定義したクラスのインスタンスとして述べ
る。当業者には、オブジェクトは他のプログラミング言
語を使用して定義できると評価するものもいる。クラス
の継承は、コード共用の1形式である。クラス開発者
は、他の開発者にクラスの処理系を提供することができ
る。この他の開発者は、提供されたクラスから導出する
クラスを作成することができる。ただし、クラスが継承
されて、仮想関数が優先される場合は、優先する仮想関
数のテストは複雑になることが考えられる。優先仮想関
数は、非優先関数に影響を与えながら、オブジェクトの
状態を修正する。このため、各継承関数は、優先仮想関
数のテストと同時に独立したテストをする必要がある。
テストの複雑さを改善するには、クラス処理系の開発者
は処理系でソースコードを分散することができる。残念
ながら、ソースコードを分散すると、上述のように、共
用ソースコードに同様の支障が生じる。
【0011】オブジェクト指向技術の利点は、オブジェ
クトの共用を容易にできることである。特に、オブジェ
クト指向技術は複合文書の作成を容易にする。複合文書
は、さまざまなコンピュータプログラムによって生成さ
れたオブジェクトを含む文書である。(一般に、オブジ
ェクトのデータメンバとクラス型のみが複合文書に格納
される。)例えば、スプレッドシートプログラムで生成
したスプレッドシートオブジェクトを含むワードプロセ
ッシング文書は、複合文書である。ワードプロセッシン
グプログラムでは、ユーザは(セルなど)スプレッドシ
ートをワードプロセッシング文書内に埋め込むことがで
きる。この埋め込みは、ワードプロセッシングプログラ
ムを、埋め込むべきオブジェクトのクラス定義を使用し
て埋め込んだオブジェクトのメンバ関数にアクセスし
て、コンパイルすることによって可能となる。このた
め、ワードプロセッシングプログラムは、ワードプロセ
ッシング文書に埋め込むことができるオブジェクトの各
クラスのクラス定義を使用してコンパイルしなければな
らないだろう。新しいクラスのオブジェクトをワードプ
ロセッシング文書に埋め込むには、ワードプロセッシン
グプログラムは新たなクラス定義でリコンパイルしなけ
ればならないと考えられる。このため、ワードプロセッ
シングプログラムの開発者が選択したクラスオブジェク
トだけを埋め込むことができる。さらに、新たなクラス
をワードプロセッシングプログラムを新たにリリースし
てのみ支援することができる。
【0012】任意クラスのオブジェクトを複合文書に埋
め込むには、どうすればオブジェクトをワードプロセッ
シングプログラムがコンパイル時間にクラス定義にアク
セスする必要なしにアクセスできるかで、インタフェー
スを定義する。抽象クラスは仮想メンバ関数が処理系を
持たない(純粋な)クラスである。インタフェースはデ
ータメンバがない抽象クラスであり、その仮想関数はす
べて純粋である。以下のクラス定義は、インタフェース
の定義の一例である。この例では、説明を簡略にするた
めに、オブジェクトのクラスを問わず文書に埋め込ませ
るより、むしろ、ワードプロセッシングプログラムでス
プレッドシートオブジェクトを埋め込ませている。オブ
ジェクトがどのように処理されたかを問わず、このイン
タフェースを提供するスプレッドシートはすべて埋め込
むことができる。さらに、ワードプロセッシングプログ
ラムをコンパイルする前あるいは後に処理されたかに関
係なく、スプレッドシートを問わず埋め込むことができ
る。 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; } スプヘレッドシートプログラムの開発者は、インタフェ
ースの処理系を供給して、スプレッドシートオブジェク
トをワードプロセッシング文書に埋め込ませる必要があ
るだろう。ワードプロセッシングプログラムによってス
プレッドシートオブジェクトを埋め込ませる場合、その
プログラムはスプレッドシートオブジェクトに対するイ
ンタフェースを実現するコードにアクセスしなければな
らない。そのコードにアクセスするために、各処理系に
は独特のクラス識別子が与えられる。例えば、Microsof
t Corporation が開発したスプレッドシートオブジェク
トは、「MSSpreadsheet 」というクラス識別子を有する
ことができる。また、他社開発のスプレッドシートオブ
ジェクトは、「LTSSpreadsheet」という識別子を有する
ことができる。各コンピュータシステムでは常駐登録簿
を維持して、各クラス識別子をクラスを実現するコード
にマップする。一般に、スプレッドシートプログラムが
コンピュータシステムにインストールされると、常駐登
録簿を更新し、スプレッドシートオブジェクトのクラス
の可用性を反映する。スプレッドシート開発者がインタ
フェースによって定義した各メンバ関数を処理し常駐登
録簿を維持する限り、ワードプロセッシングプログラム
は開発者のスプレッドシートオブジェクトをワードプロ
セッシング文書に埋め込むことができる。
【0013】しかし、さまざまなスプレッドシート開発
者が特定のメンバ関数のみ実行したいと願っていること
だろう。例えば、あるスプレッドシート開発者はデータ
ベース支援を実行したくないが、その他のメンバ関数は
支援したいと考えているかもしれない。オブジェクトを
埋め込むことができる上に、スプレッドシートの開発者
がメンバ関数の一部のみを支援できるようにするには、
スプレッドシートオブジェクトに対して複数のインタフ
ェースを定義する。インタフェースIDatabaseおよびIBa
sicなどを、下記のようにスプレッドシートに定義する
ことができる。 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を実行したいと考えるであろ
う。
【0014】実行時において、ワードプロセッシングプ
ログラムは埋め込むべきスプレッドシートオブジェクト
がIDatabase インタフェースを支援するかどうかを決定
しなくてはならなくなる。この決定の際に、別のインタ
フェースをどのインタフェースをオブジェクトに埋め込
むことができるかを指示するメンバ関数を用いて(すべ
てのスプレッドシートオブジェクトが実行することを)
定義する。このインタフェースはIUnknownという名で、
(未確認インタフェースあるいはオブジェクト管理イン
タフェースと呼ばれ、)下記のように定義される。 class IUnknown { virtual boolean QueryInterface(REFIID iid, void**ppv) = 0; virtual void AddRef() = 0; virtual void Release() = 0; } このIUnknownインタフェースは、メンバ関数(メソッ
ド)QueryInterfaceを定義する。メソッドQueryInterfa
ceは、(REFIID型の)パラメータiid 中の(IDatabase
などの)インタフェース識別子に渡されて、ポインタを
このメソッドがパラメータppv に呼び出されるオブジェ
クト用に識別したインタフェースの処理系に戻す。この
オブジェクトがインタフェースを支援しなければ、この
メソッドは偽に戻る。
【0015】 コード表1 booleanXX : : 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; } コード表1は、クラスXX対応のメソッドQueryInterface
の一般的な処理系に対するC++のソースコードを含
み、クラスIUnknownを継承する。スプレッドシートオブ
ジェクトがIDatabase インタフェースを支援する場合、
メソッドQueryInterfaceはswitch文内に適切なcaseラベ
ルを含む。変数pIBasic とpIDatabaseは、ポインタをIB
asicインタフェースとIDatabase インタフェースの仮想
関数表へそれぞれポイントする。インタフェースへのポ
インタが戻されると、メソッドQueryInterfaceは(以下
の) メソッドAddRefを呼び出し、クラスXXのオブジェク
トに対する参照カウント値をインクリメントする。
【0016】 コード表2 void XX : : AddRef(){refcount++ ;} void XX : : Release() {if(--refcount==0)delete this ;} インタフェースIUnknownは、メソッドAddRefおよびRele
ase も定義する。これらは、参照カウントの実行に使用
される。インタフェースに対し新たな参照を作成する度
に、メソッドAddRefを呼び出し、オブジェクトの参照カ
ウント値をインクリメントする。参照が不要になる度
に、メソッドRelease を呼び出し、オブジェクトの参照
値をディクリメントし、参照値が0になった場合にはオ
ブジェクトの割当てを解除する。コード表2は、クラス
XXに対応するメソッドAddRefおよびRelease の一般的な
処理系に対するC++のソースコードを含み、クラスIU
nknownを継承する。IDatabase インタフェースとIBasic
インタフェースはIUnknownインタフェースを継承する。
下記の定義は、IUnknownインタフェースの使用法を示
す。 class IDatabase:public IUnknown { publicl: virtual void Data() = 0; } class IBasic:public IUnknown { public: virtual void File() = 0; virtual void Fdil() = 0; virtual void Formula() = 0; virtual void Fromat() = 0; virtual void GetCell(stning RC, cell*pCell) = 0; } 図2は、スプレッドオブジェクトのサンプルデータ構造
を示すブロック図である。このスプレッドオブジェクト
は、オブジェクトデータ構造201と、IBasicインタフ
ェースデータ構造204と、仮想関数表202、205
および206と、メソッド207乃至221とを含む。
オブジェクトデータ構造201は、仮想関数表202に
対するポインタとIBasicインタフェースおよびIDatabas
e インタフェースに対するポインタとを含む。仮想関数
表202の各エントリは、IUnknownインタフェースのメ
ソッドへのポインタを含む。IBasicインタフェースデー
タ構造203は、仮想関数表205へのポインタを含
む。仮想関数表205の各エントリは、IBasicインタフ
ェースのメソッドに対するポインタを含む。IDatabase
インタフェース構造204は、仮想関数表206に対す
るポインタを含む。仮想関数表207の各エントリは、
IBasicインタフェースのメソッドのポインタを含む。IB
asicインタフェースおよびIDatabase インタフェース
は、IUnknownインタフェースを継承し、仮想関数表20
5および206は、メソッドQueryInterface、AddRefお
よびRelease を各々含む。下記において、オブジェクト
データ構造は、オブジェクトがアクセスできるインタフ
ェースでラベル付けした形式222によって表わされ
る。
【0017】下記の擬似コードでは、ワードプロセッシ
ングプログラムが、スプレッドシートオブジェクトがID
atabase インタフェースを支援するかどうかを定義する
方法を示す。 if(pIBasic->QueryInterface("IDatabse" , & pIDatabase)) \*IDatabase Supported else \*IDatabase not Supported ポインタ pIBasicは、オブジェクトのIBasicインタフェ
ースに対するポインタである。このオブジェクトがIDat
abase インタフェースを支援する場合は、メソッドQuer
yInterfaceはポインタpIDatabaseをセットし、IDatabas
e データ構造にポイントして、その値通り真に戻る。通
常、オブジェクトを変数宜言または「新たな」オペレー
タによって具体化することができる(メモリ内に作成し
たオブジェクトのインスタンス)。ただし、どちらの実
現化技術でも、実行時にワードプロセッシングプログラ
ムにスプレッドオブジェクトを実現化させる必要があ
る。広域関数CreateInstanceXXを供給する技術もあり、
下記のように定義される。
【0018】static void CreateInstanceXX(REFIID ii
d, void**ppv) = 0 ; メソッドCreateInstanceXXは、クラスXXのオブジェクト
を実現化し、ポインタppv をパラメータiid によって定
義したオブジェクトのインタフェースに戻す。
【0019】
【発明が解決しようとする課題】上述のように、従来の
技術では、ソフトウェアの開発者らが所望のコードを共
用する際にその手続きが複雑になるという欠点があっ
た。したがって、本発明の目的は、オブジェクトを集合
させるための方法とそのシステムを提供することにあ
る。本発明の別の目的は、オブジェクトを別のオブジェ
クト内に囲む一方、囲まれたオブジェクトのインタフェ
ースを、囲んでいるオブジェクトのクライアントに提示
する方法とそのシステムを提供することにある。また、
本発明の別の目的は、別のオブジェクト内に囲むことが
できるか、オブジェクトの処理系を修正せずには別のオ
ブジェクト内に囲むことができないオブジェクトを実現
するための方法およびシステムを提供することにある。
さらに、本発明の別の目的は、集合オブジェクトを実現
し、クライアントがオブジェクトが集合体であることを
意識させないための方法およびシステムを提供すること
にある。本発明のもっと別な目的は、オブジェクトを囲
むことによって、囲まれたオブジェクト自体が、任意の
レベルの囲いに対して囲いをするオブジェクトと成りう
る方法およびシステムを提供することにある。
【0020】上記の目的を含めた他の目的は、本発明の
以下の記載で明らかなように、コンピュータシステム内
でオブジェクトを集合させる方法およびシステムによっ
て提供される。本発明の方法は、囲まれたオブジェクト
を、囲んでいるオブジェクト内に集合させることが好ま
しい。この囲まれたオブジェクトは、オブジェクト管理
インタフェースと1以上の外部インタフェースを有し、
これを囲むオブジェクトが制御オブジェクト管理インタ
フェースを有する。集合オブジェクトによってクライア
ントに提示した各インタフェースは、質問メンバ関数を
有しインタフェースの識別子を受取って、識別済のイン
タフェースに参照を戻す。囲んでいるオブジェクトの制
御オブジェクト管理インタフェースの質問メンバ関数
は、囲んでいるオブジェクトによって提示されたインタ
フェースの識別子を受取り、提示したインタフェースに
参照を戻す。本発明の好ましい方法では、囲まれたオブ
ジェクトのインスタンスを作成する。囲まれたオブジェ
クトの提示したインタフェースの質問メンバ関数は、イ
ンタフェースの識別子を受取り、受け取った識別子を渡
す囲んでいるオブジェクトの制御オブジェクト管理イン
タフェースの質問メンバ関数を呼び出し、さらに、囲ん
でいるオブジェクトの制御オブジェクト管理インタフェ
ースの呼び出された質問メンバ関数によって戻される参
照を識別済インタフェースの参照として戻す。
【0021】本発明では、囲まれたオブジェクトの質問
メンバ関数は、囲まれたオブジェクトの外部インタフェ
ースの知識を用いて実現され、囲んでいるオブジェクト
または他の囲まれたオブジェクトの(制御オブジェクト
管理インタフェース以外の)インタフェースの知識を有
さないのが好ましい。
【0022】
【課題を解決するための手段】上記目的を達成するため
に、本発明のオブジェクト集合方法およびシステムは、
囲まれたオブジェクトは、オブジェクト管理インタフェ
ースおよび外部インタフェースを有し、囲んでいるオブ
ジェクトは、制御オブジェクト管理インタフェースを有
し、各インタフェースは、インタフェースの識別子を受
け取るための質問メンバ関数と識別済のインタフェース
に参照を戻すことによって、コンピュータシステム内
で、前記囲まれるオブジェクトを前記囲んでいるオブジ
ェクト内に集合させるためのオブジェクト集合方法にお
いて、囲んでいるオブジェクトのインタフェースを作成
することによって、囲んでいるオブジェクトの制御オブ
ジェクト管理インタフェースの質問メンバ関数が囲まれ
たオブジェクトの外部インタフェースの識別子を受取
り、外部インタフェースへ参照を戻すステップと、囲ま
れたオブジェクトのインスタンスを作成して、囲まれた
オブジェクトの外部インタフェースの質問メンバ関数が
インタフェースの識別子を受取り、該受け取られた識別
子を渡す囲んでいるオブジェクトの制御オブジェクト管
理インタフェースのメンバ関数を呼び出し、囲んでいる
オブジェクトの制御オブジェクト管理インタフェースの
呼び出された質問メンバ関数によって戻される参照を識
別済のインタフェースに対する参照として戻すステップ
と、を有することを特徴とする。
【0023】このため、本発明のオブジェクト集合方法
およびシステムは、前記オブジェクトが集合オブジェク
トであることを特徴とする。本発明のオブジェクト集合
方法およびシステムは、前記集合オブジェクトが集合可
能なオブジェクトでないことを特徴とする。本発明のオ
ブジェクト集合方法およびシステムは、前記囲まれたオ
ブジェクトの制御オブジェクト管理インタフェースの質
問メンバ関数が該囲まれたオブジェクトの外部インタフ
ェースに関し、特定知識を有さない。本発明のオブジェ
クト集合方法およびシステムは、前記囲んでいるオブジ
ェクトの制御オブジェクト管理インタフェースの質問メ
ンバ関数が囲まれたオブジェクトの外部インタフェース
に関する特定知識を有さない。本発明のオブジェクト集
合方法およびシステムは、前記囲んでいるオブジェクト
の制御オブジェクト管理インタフェースの質問メンバ関
数が囲まれたオブジェクトのオブジェクト管理インタフ
ェースの質問メンバ関数を呼び出して、該囲まれたオブ
ジェクトの外部インタフェースに対する参照を検索す
る。本発明のオブジェクト集合方法およびシステムは、
前記囲んでいるオブジェクトが囲まれているオブジェク
トの外部インタフェースを格納して、囲んでいるオブジ
ェクトの制御オブジェクト管理インタフェースの質問メ
ンバ関数が該格納された参照を囲まれたオブジェクトの
外部インタフェースとして戻す。
【0024】本発明のオブジェクトの集合方法およびシ
ステムは、クラスはオブジェクト管理インタフェースお
よび外部インタフェースを有し、該オブジェクト管理イ
ンタフェースと外部インタフェースは各インタフェース
にアクセスするための質問メンバ関数を有し、集合オブ
ジェクトを定義するクラスを実現するコンピュータシス
テムに関するオブジェクト集合方法およびシステムにお
いて、作成インスタンスメンバ関数を生成しクラスのオ
ブジェクトを具体化し、作成インスタンスメンバ関数が
オブジェクトを集合させない場合にはクラスのデータメ
ンバ中にクラスのオブジェクト管理インタフェースに対
する参照を格納し、データを集合させる場合にはクラス
のデータメンバ中に囲んでいるオブジェクトの制御オブ
ジェクト管理インタフェースに対する参照を格納するス
テップと、オブジェクト管理インタフェースの質問メン
バ関数を生成することによって、質問メンバ関数がイン
タフェースの識別子を受取り、識別されたインタフェー
スに対して参照を戻すステップと、外部インタフェース
の質問メンバ関数を生成して、質問メンバ関数がインタ
フェースの識別子を受取り、該インタフェースの識別子
を渡すデータメンバによって参照を付せられたオブジェ
クト管理インタフェースを呼び出し、該呼び出された質
問メンバ関数によって戻される参照を戻すステップと、
を有する。
【0025】本発明のオブジェクト集合方法およびシス
テムは、クラスのオブジェクトを実現化するためのグロ
ーバル作成インスタンス関数を生成し、グローバル作成
インスタンス関数が作成インスタンスメンバ関数を呼び
出しクラスのインスタンスを作成し、かつ、オブジェク
ト管理インタフェースから質問メンバ関数を呼び出しク
ラスの外部インタフェースに対する参照を検索すること
によって、グローバル作成インスタンス関数をクライア
ントによって呼び出し、クライアントがクラスに対する
クラス定義にアクセスする必要なく、クラスのインスタ
ンスを作成するステップを有する。本発明のオブジェク
トの集合方法およびシステムは、集合オブジェクトを作
成し、集合オブジェクトは囲まれたオブジェクトを有
し、囲まれたオブジェクトは集合体によって提示される
外部インタフェースを有するオブジェクト集合方法およ
びシステムにおいて、集合オブジェクトを具体化し、集
合オブジェクトが質問メンバ関数を有して、集合オブジ
ェクトによって提示されたインタフェースに対する参照
を検索するステップと、囲まれたオブジェクトを具体化
し、囲まれたオブジェクトが外部インタフェースの質問
メンバ関数を有し、集合オブジェクトによって指示され
たインタフェースに対する参照を検索するステップと、
囲まれたオブジェクトに対する参照を格納し、集合オブ
ジェクトの質問メンバ関数は囲まれたオブジェクトに対
して格納した参照を使用し、提示された外部インタフェ
ースに対する参照を検索するステップと、集合オブジェ
クトに対する参照を格納し、外部インタフェースの質問
メンバ関数は集合オブジェクトに対して格納した参照を
集合オブジェクトによって提示されたインタフェースに
対する参照を検索するステップと、を有する。
【0026】本発明のオブジェクト集合方法およびシス
テムは、前記囲まれたオブジェクトに対して格納した参
照が、質問メンバ関数を有する囲まれたオブジェクトの
オブジェクト管理インタフェースに対する参照であり、
集合オブジェクトの質問メンバ関数が参照されたオブジ
ェクト管理インタフェースの質問メンバ関数を呼び出
し、提示された外部インタフェースに対する参照を検索
するステップを有する。本発明のオブジェクト集合方法
およびシステムは、前記囲まれたオブジェクトに対して
格納した参照は、囲まれたオブジェクトの外部インタフ
ェースに対する参照であり、集合オブジェクトの質問メ
ンバ関数は、外部インタフェースに対する参照を提示さ
れた外部インタフェースに対する参照として使用するス
テップを有する。本発明のオブジェクト集合方法および
システムは、前記外部インタフェースの質問メンバ関数
は集合オブジェクトに対して格納した参照を使用し、集
合オブジェクトの質問メンバ関数を呼び出し、集合オブ
ジェクトによって提示されたインタフェースに対する参
照を検索するステップを有する。本発明のオブジェクト
集合方法およびシステムは、前記囲まれたオブジェクト
に対して格納した参照が質問メンバ関数を有する囲まれ
たオブジェクトのオブジェクト管理インタフェースに対
する参照であり、集合オブジェクトの質問メンバ関数が
参照オブジェクト管理インタフェースの質問メンバ関数
を呼び出し、提示された外部インタフェースに対する参
照を検索する。
【0027】本発明のオブジェクト集合方法およびシス
テムは、前記外部インタフェースが加算参照を供給し、
参照計数メンバ関数を解放し、集合オブジェクトが加算
参照を供給し参照計数関数を解放し、囲まれたオブジェ
クトの外部インタフェースの参照計数メンバ関数が集合
オブジェクトの参照計数メンバ関数を呼び出すステップ
を有する。本発明のオブジェクト集合方法およびシステ
ムは、囲んでいるオブジェクト内に囲まれたオブジェク
トを囲み、囲んでいるオブジェクトが質問メンバ関数を
有し、囲まれたオブジェクトは質問メンバ関数を有し、
それぞれの質問メンバ関数が、囲んでいるオブジェクト
によって提示されたインタフェースに対する参照を検索
し、囲まれたオブジェクトは囲んでいるオブジェクトに
よって提示された外部インタフェースを有するオブジェ
クトの集合方法およびシステムにおいて、囲んでいるオ
ブジェクトを具体化するステップと、囲まれたオブジェ
クトを具体化するステップと、囲んでいるオブジェクト
内に囲まれたオブジェクトに対する参照を格納するステ
ップとを有し、囲んでいるオブジェクトの質問メンバ関
数を実行する場合に、囲まれたオブジェクトの質問メン
バ関数を呼び出し、囲まれたオブジェクトに対して格納
した参照を利用して囲まれたオブジェクトの提示された
外部インタフェースに対する参照を検索する。
【0028】本発明のオブジェクト集合方法およびシス
テムは、囲んでいるオブジェクトに対して提示されたイ
ンタフェースに対する複数の参照を反映する囲んでいる
オブジェクト内に参照カウントを維持するステップを有
する。本発明のオブジェクト集合方法およびシステム
は、囲んでいるオブジェクト内に囲まれたオブジェクト
を囲み、囲んでいるオブジェクトが質問メンバ関数を有
し、囲まれたオブジェクトは質問メンバ関数を有し、そ
れぞれの質問メンバ関数が、囲んでいるオブジェクトに
よって提示されたインタフェースに対する参照を検索
し、囲まれたオブジェクトは囲んでいるオブジェクトに
よって提示された外部インタフェースを有するオブジェ
クトの集合方法およびシステムにおいて、囲んでいるオ
ブジェクトを具体化するステップと、囲まれたオブジェ
クトを具体化するステップと、囲まれたオブジェクト内
に囲んでいるオブジェクトに対する参照を格納するステ
ップとを有し、囲まれたオブジェクトの質問メンバ関数
を実行する場合に、囲んでいるオブジェクトの質問メン
バ関数を呼び出し、囲んでいるオブジェクトに対して格
納した参照を利用して囲まれたオブジェクトの提示され
たインタフェースに対する参照を検索する。
【0029】本発明のオブジェクト集合方法およびシス
テムは、囲んでいるオブジェクトに対して提示されたイ
ンタフェースに対する複数の参照を反映する囲んでいる
オブジェクト内に参照カウントを維持するステップを有
する。本発明のオブジェクト集合方法およびシステム
は、囲まれたオブジェクトの質問メンバ関数を囲まれた
オブジェクトの外部インタフェースに対応させ、囲まれ
たオブジェクトが質問メンバ関数を備えたオブジェクト
管理インタフェースを有し、囲んでいるオブジェクトの
質問メンバ関数が囲まれたオブジェクトのオブジェクト
管理インタフェースに質問メンバ関数を呼び出し、囲ま
れたオブジェクトの外部インタフェースに対する参照を
検索する。本発明のオブジェクト集合方法およびシステ
ム集合オブジェクトが囲まれるオブジェクトと囲んでい
るオブジェクトを有し、囲んでいるオブジェクトが参照
カウントと加算参照メンバ関数と解放メンバ関数とを有
し、囲まれたオブジェクトが加算参照メンバ関数と解放
参照メンバ関数とを有し、集合オブジェクトに対して参
照の計数を行なうオブジェクト集合方法およびシステム
において、囲まれたオブジェクトの加算参照メンバ関数
の制御下で、囲んでいるオブジェクトの加算メンバ関数
を呼び出し、囲んでいるオブジェクトの加算参照メンバ
関数が参照カウントをインクリメントするステップと、
囲まれたオブジェクトの解放参照メンバ関数の制御下
で、囲いでいるオブジェクトの解放参照メンバ関数を呼
び出し、囲んでいるオブジェクトの解放参照メンバ関数
が参照カウントをディクリメントするステップと、を有
する。
【0030】本発明のオブジェクト集合方法およびシス
テムは、参照カウントが集合オブジェクトに対する参照
が存在しないことを示した場合、囲んでいるオブジェク
トと囲まれたオブジェクトを削除する。本発明のオブジ
ェクト集合方法およびシステムは、クラスがオブジェク
ト管理インタフェースと外部インタフェースとを有し、
オブジェクト管理インタフェースと外部インタフェース
がそれぞれ質問メンバ関数を有して、集合可能なオブジ
ェクトのインタフェースにアクセスし、集合可能なオブ
ジェクトを定義するクラスを実現するコンピュータシス
テムに関するオブジェクトの集合方法およびシステムに
おいて、外部インタフェースを定義するステップと、集
合可能なクラスを定義し、集合可能なクラスが定義され
た外部インタフェースを基本クラスとして継承し、集合
クラスが定義された外部インタフェースの質問メンバ関
数の処理系を有し、オブジェクトを集合させていない場
合には、定義された外部インタフェースの質問メンバ関
数がオブジェクト管理インタフェースを呼び出し、集合
可能なオブジェクトを集合させている場合には、集合し
ているオブジェクトの質問メンバ関数を呼び出すことを
特徴とするステップと、を有する。
【0031】本発明のオブジェクトの集合方法およびシ
ステムは、コンピュータシステムの集合オブジェクト
が、オブジェクトのインタフェースの識別子を受取り、
インタフェースに対して参照を戻すための質問メンバ関
数を有するオブジェクト管理インタフェースと、インタ
フェースの識別子を受取り、オブジェクトを集合させて
いない場合にはオブジェクト管理インタフェースの質問
メンバ関数が呼び出し、オブジェクトを集合させている
場合には、囲んでいるオブジェクトの質問メンバ関数を
呼び出し、識別されたインタフェースに対する参照を戻
すための質問メンバ関数を有する外部インタフェース
と、を含む。
【0032】
【実施例】本発明は、コンピュータシステムにおいてオ
ブジェクトを集合させる方法を提供する。態様として
は、集合オブジェクトがそのクライアントに複数のイン
タフェースを供給することが好ましい。オブジェクトを
具体化するコンピュータプログラムをクライアントと呼
ぶ。集合オブジェクトは、1つ以上の囲まれたオブジェ
クトとIUnknownインタフェースの処理系とからなり、こ
の処理系を集合オブジェクトの制御IUnknownインタフェ
ースと呼ぶ。集合オブジェクトは、そのクライアントに
それ自体のインタフェースと囲まれたオブジェクトから
のインタフェースを提示する。制御IUnknownインタフェ
ースのメソッドQueryInterfaceはポインタを集合オブジ
ェクトによって提示された各インタフェースに戻す。集
合オブジェクトは各囲まれたオブジェクトを具体化す
る。この具体化は、集合オブジェクトの構成を通じてで
きるし、囲まれたオブジェクトのインタフェースが必要
になるまで延期することもできる。各囲まれたオブジェ
クトは、制御IUnknownインタフェースに対するポインタ
を含む。囲まれたオブジェクトの提示したインタフェー
スのメソッドQueryInterfaceは、IUnknownインタフェー
スのメソッドQueryInterfaceの呼び出しを実現できるこ
とが好ましい。囲まれたオブジェクトを実現した場合、
一般に開発者らは囲んでいるオブジェクトがどのインタ
フェースを提示するかについての知識はない。結果的
に、囲まれたオブジェクトのメソッドQueryInterfaceが
制御IUnknownインタフェースを呼び出して、要求したイ
ンタフェースのポインタを検索する。制御IUnknownイン
タフェースのメソッドQueryInterfaceは、一般に提示し
たすべてのインタフェースの知識をもって実現される。
オブジェクトが囲まれていない場合、制御IUnknownイン
タフェースは、そのオブジェクトのIUnknownインタフェ
ースであり。逆に、オブジェクトが囲まれている場合
は、制御IUnknownインタフェースは囲んでいるオブジェ
クトのIUnknownインタフェースである。
【0033】本発明では、集合オブジェクトが参照カウ
ントを維持することが好ましい。集合オブジェクトを具
体化した場合、その参照カウントは1にセットされる。
制御IUnknownのメソッドQueryInterfaceは、参照がクラ
イアントに戻されると、参照カウントをインクリメント
する。囲まれたオブジェクトの提示されたインタフェー
スのメソッドAddRefは、制御IUnknownインタフェースの
メソッドAddRefを呼び出し、集合オブジェクトの参照カ
ウントをインクリメントする。同様に囲まれたオブジェ
クトの提示されたインタフェースのメソッドRelease
は、制御IUnknownインタフェースのRelease を呼び出
し、集合オブジェクトの参照カウントをディクリメント
し、参照カウントが0ならば集合オブジェクトを削除す
る。囲まれたオブジェクトを具体化した場合、囲まれた
オブジェクトの参照カウントは0にセットされる。集合
オブジェクトが削除された場合、各囲まれたオブジェク
トのIUnknownインタフェースのメソッドRelease が呼び
出され、囲まれたオブジェクトを消去する。本発明によ
るオブジェクト集合方法およびシステムは、中央演算処
理装置(CPU)、メモリおよび入出力装置を含むコン
ピュータで実行されることが好ましい。
【0034】図3は、集合オブジェクトを示すブロック
図である。集合オブジェクトS3はインタフェースA、
B、CおよびFならびに制御IUnknownを提示する。(囲
んでいる)集合オブジェクトS3は、囲まれたオブジェ
クトS1・303、囲まれたオブジェクトS2・30
2、処理系I3・304とを含む。囲まれたオブジェク
トS1は外部インタフェースCおよびDを実現し、囲ま
れたオブジェクトS2は外部インタフェースEおよびF
を実現する。(外部インタフェースは、囲んでいるオブ
ジェクトによって提示できるオブジェクトのインタフェ
ースである。内部インタフェースは囲んでいるオブジェ
クトによっては提示できないオブジェクトのインタフェ
ースである。)処理系I3は外部インタフェースAおよ
びBと、制御IUnknownを実現する。集合オブジェクトS
3のクライアントは、オブジェクトが集合体であること
を意識する必要はない。集合オブジェクトS3は、オブ
ジェクトS1およびS2を集合オブジェクトS3の構成
中またはそれより遅い時間に具体化する。処理系S3
は、オブジェクトS1およびS2のIUnknownインタフェ
ースに対するポインタを含む。オブジェクトS1および
S2は、初期化されて制御IUnknownインタフェースに対
するポインタを含む。
【0035】提示されたインタフェースのメソッドQuer
yInterfaceは、ポインタを提示された各インタフェース
に戻し、ポインタが戻されたときに集合オブジェクトの
参照カウントをインクリメントすることができる。制御
IUnknownのメソッドQueryInterfaceは、処理系I3を実
現し、囲まれたオブジェクトのIUnknownインタフェース
のメソッドQueryInterfaceを呼び出して、囲まれたオブ
ジェクトS1およびS2の提示されたインタフェース−
−CおよびF−−に対するポインタを検索するインタフ
ェース−−A、Bおよび制御IUnknown−−に対するポイ
ンタに直接アクセスする。囲まれたインタフェースに対
するポインタを戻すと、制御IUnknownインタフェースの
メソッドQueryInterfaceは、制御IUnknownインタフェー
スのメソッドAddRefを呼び出すことによって、集合オブ
ジェクトS3の参照カウントをインクリメントする。
(制御IUnknownインタフェース以外の)各提示されたイ
ンタフェースのQueryInterfaceは、制御IUnknownインタ
フェースのメソッド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 IC } 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),mD(thid) { if(punkOuter == NULL) m punkouter = this; else m punkouter = punkOuter, m refcount = 0; } class C:public IC { public: 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: 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; } コード表3オブジェクトS1のC++クラス定義を含
み、オブジェクトのインスタンスを作成するグローバル
関数を加えて集合体(集合オブジェクト)を囲むことが
できる。IUnknown、ICおよびIDは、各インタフェースの
メソッドを定義するインタフェースである。クラスS1
は、IUnknownインタフェース、ICインタフェースおよび
IDインタフェースを実現する。クラスS1は、ICインタ
フェースおよびIDインタフェースを外部インタフェース
として実現する。図4は、クラスS1のオブジェクトの
インスタンスのデータ構造レイアウトのブロック図であ
る。インスタンス構造401はクラスS1のデータメン
バ( m C 、 m D 、 m punkOuter 、 m refcount)
とポインタ、ここでは仮想関数表ポインタ(S1::vfptr)
を含む。データメンバ m C および m D は、それぞれ
クラスCおよびDのオブジェクトのインスタンスであ
る。クラスCおよびクラスDはクラスS1を支援し、オ
ブジェクトCおよびDはクラスS1の私的メンバにアク
セスすることができる。仮想関数表ポインタS1::vfptr
は、仮想関数表402をポイントし、データメンバ内の
仮想関数ポインタ m C S1::C::vfptrは仮想関数表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の関数Create
Instanceである。関数409乃至412は、クラスCの
メンバ関数である。関数412は、クラスCの構成子で
ある。関数413乃至416は、クラスDのメンバ関数
である。関数416は、クラスDの構成子である。
【0036】コード表3に示したように、メソッドS1::
QueryInterfaceはインタフェースC、インタフェースD
またはインタフェースIUnknownに対するポインタを戻
し、メソッドS1::AddRefを呼び出し、オブジェクトS1
の参照カウントをインクリメントする。メソッドS1::Ad
dRefは参照カウントをインクリメントして、メソッドS
1::Release は参照カウントをディクリメントし、参照
カウントが0になった場合はオブジェクトS1を削除す
る。グローバル関数CreateInstanceS1は、クラスオブジ
ェクトS1のインスタンスを作成する。クライアントが
この関数を呼び出し、クラスオブジェクトS1を具体化
する。このため、クライアントは、コンパイル時間また
は実行時にクラスS1の定義にアクセスせずに、クラス
S1のオブジェクトを具体化できる。具体化したオブジ
ェクトS1が集合オブジェクトおよびインタフェースの
識別子iid 内に囲まれて戻る場合、関数CreateInstance
S1は、制御IUnknown(punkOuter)に対するポインタに渡
される。関数CreateInstanceS1は、識別されたインタフ
ェースに対するポインタ(ppv)を戻す。関数CreateInst
anceS1は、パラメータpunkOuter を渡しながら、メソッ
ドS1::CreateInstanceを呼び出す。メソッドS1::Create
Instanceは、オブジェクトS1を具体化し、オブジェク
トS1のIUnknownインタフェースに対するポインタ(pu
nk) を戻す。関数CreateInstanceS1は、オブジェクトS
1のメソッドQueryInterfaceを呼び出し、識別されたイ
ンタフェースに対するポインタを検索する。関数Create
InstanceS1は、オブジェクトS1のメソッドRelease を
呼び出すが、これは、一時ポインタpunkが必要となくな
ったからである。メソッドS1::CreateInstanceはオブジ
ェクトS1を具体化し、オブジェクトS1のIUnknownイ
ンタフェースに対するポインタ(ppunk)を戻す。メソッ
ドS1::CreateInstanceは、制御IUnknownに対するポイン
タ(punkOuter)に渡される。メソッドS1::CreateInstan
ceは新たにオペレータを使用して、オブジェクトS1を
具体化する。具体化している間に、構成子S1::S1を呼び
出し、パラメータpunkOuter の値に渡す。オブジェクト
S1が構成された後、メソッドCreateInstanceは、メソ
ッドS1::QueryInterfaceを呼び出し、オブジェクトS1
のIUnknownインタフェースに対するポインタを検索す
る。
【0037】構成子S1::S1は、データメンバ m C 、 m
D 、 m punkOuter および m refcountを初期化す
る。構成子S1::S1は、パラメータpunkOuter に渡され
る。データメンバ m C および m D の具体化中、構成
子C::CおよびD::Dを呼び出し、オブジェクトS1に対す
るポインタthisに渡す。パラメータpunkOuter の値がNU
LLであれば、構成子S1::S1はデータメンバ m punkOute
r をポインタthisの値にセットする(このポインタは、
新たに具体化したオブジェクトS1をポイントする)。
パラメータpunkOuter の値がNULLでなければ、構成子S
1::S1は、データメンバ m punkOuter をパラメータpun
kOuter の値にセットする。データメンバ m punkOuter
は、オブジェクトS1が囲まれている場合には、集合体
の制御IUnknownの値をポイントし、オブジェクトS1が
囲まれていない場合には、オブジェクトS1の制御IUnk
nownをポイントする。構成子S1::S1は、データメンバ m
fercountをゼロに初期化もする。構成子C::Cは、オブ
ジェクトS1に対するポインタに渡される。構成子C1::
C1は、渡されたポインタをC::m pS1 内に格納する。デ
ータメンバC::m pS1 は、クラスCのメソッドによって
使用され、データメンバS1:: m punkOuter にアクセス
する。
【0038】メソッドC::QueryInterface 、C::AddRef
およびC::Releaseは、データメンバS1:: m punkOuter
によってポイントされるIUnknownインタフェースの中で
対応するメソッドを呼び出し、これによってオブジェク
トS1が囲まれている場合には、集合体の制御IUnknown
Interface にポイントする。クラスDの構成子およびそ
の他のメソッドはクラスCの構成子およびその他のメソ
ッドに類似している。図4は、集合体の部分以外のオブ
ジェクトS1のインスタンスである。データメンバS1::
C::m pS1 、S1::D::m pS1 および S1::m punkOuter
は、オブジェクトS1自体に対するポインタに初期化さ
れる。データメンバ m C およびm D のメソッドQueryIn
terface、AddRefおよびRelease は、オブジェクトS1
のインタフェースのIUnknownメソッドを呼び出す。イン
タフェースEおよびFを実現するオブジェクト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 *pS30=newS3(punkOuter) ; CreateInstanceS1(pS3->m punkOuter, IID IUnknown, pS3->m punkS1); CreateInstanceS2(pS3->m punkOuter, IID IUnknown, pS3->m punkS2); pS3->QueryInterface(iid,ppv) ; } 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->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; }; コード表4は、集合オブジェクトのC++クラス定義で
ある。クラスS3は、インタフェースIUnknownA、B、
CおよびFを提示する。インタフェースCを提供するた
めに、クラスS3は、オブジェクトS1を囲み、インタ
フェースCを提示する。インタフェースFを供給するた
めに、クラスS3は、オブジェクトS2を囲み、インタ
フェースFを提示する。オブジェクトS3は、インタフ
ェースCおよびFに対するポインタを制御IUnknownイン
タフェースのメソッドQueryInterfaceを介して戻すこと
によってインタフェースCおよびFを提示する。オブジ
ェクトS1のインタフェースDおよびオブジェクトS2
のインタフェースEは、外部インタフェースであるが、
オブジェクトS3はこれらのインタフェースを提示しな
い。
【0039】メソッドS3::QueryInterface、S3::AddRef
およびS3::Release は、集合体の制御IUnknownインタフ
ェースを構成する。メソッドS3::QueryInterfaceは、制
御IUnknownインタフェースA、B、CまたはFに対する
ポインタを戻し、オブジェクトS3に対する参照カウン
トをインクリメントする。メソッドS3::AddRefは、参照
カウントをインクリメントし、メソッドS3::Release は
参照カウントをディクリメントし参照カウントが0にな
るとオブジェクトS3を削除する。グローバル関数Crea
teInstanceS3は、クラスS3のオブジェクトのインスタ
ンスを作成する。クライアントは、この関数を呼び出し
て、クラス3のオブジェクトを具体化する。このため、
クライアントは、コンパイル時および実行時においてク
ラスS3の定義にアクセスせずにクラスS3のオブジェ
クトを具体化することができる。具体化されたオブジェ
クトS3が集合オブジェクトおよびクラスS3によって
提示されたインタフェースの識別子(iid)に囲まれて戻
る場合に、関数CreateInstanceS3は、制御IUnknownイン
タフェース(punkOuter)に対するポインタに渡される。
関数CreateInstanceS3は識別されたインタフェースに対
するポインタ(ppv) を戻す。関数CreateInstanceS3は、
パラメータpunkOuter を渡しながら、メソッドS3::Crea
teInstanceを呼び出す。メソッドS3::CreateInstance
は、オブジェクトS3を具体化し、オブジェクトS3の
IUnknownインタフェースに対するポインタ(punk)を戻
す。関数CreateInstanceS3は、メソッドS3::QueryInter
faceを呼び出し、識別されたインタフェースに対するポ
インタを検索する。一時ポインタpunkは不要になるの
で、関数CreateInstanceS3はメソッドS3::Release を呼
び出す。
【0040】メソッドS3::CreateInstanceは、オブジェ
クトS3を具体化し、オブジェクトS3のIUnknownに対
するポインタ(ppunk)を戻す。メソッドS3::CreateInst
anceは、制御IUnknownに対するポインタ(punkOuter)に
渡される。メソッドS3::CreateInstanceは、新たにオペ
レータを使用してオブジェクトS3を具体化する。具体
化を通じて、構成子S3::S3を呼び出し、パラメータpunk
Outer に渡す。オブジェクトS3が構成された後、メソ
ッドS3::CreateInstanceは関数CreateInstanceS1を呼び
出して囲まれたオブジェクトS1を作成する。メソッド
S3::S3CreateInstanceはパラメータ m p01->punkOuter
およびIUnknownインタフェース対応のインタフェース識
別子を渡して、オブジェクトS1のIUnknownインタフェ
ースに対するポインタに戻される。メソッドS3::Create
Instanceは、データメンバS3:: m punkS1内に戻されたポ
インタを格納する。メソッドS3::CreateInstanceは、関
数CreateInstanceS2を呼び出し、オブジェクトS1の作
成と同様の方法でオブジェクトS2を作成する。メソッ
ドS3::CreateInstanceは、パラメータiid によって識別
されたインタフェースに対するポインタを検索する。メ
ソッドS3::AddRefは、オブジェクトS3の参照カウント
をインクリメントする。メソッドS3::Release は、参照
カウントをディクリメントする。参照カウントが0にな
ると、メソッドS3::Release は、オブジェクトS3を削
除する。
【0041】構成子S3::S3は、データメンバ m A 、 m
B 、 m punkouter および m refcountを初期化す
る。構成子S3::S3は、パラメータpunkOuter に渡され
る。データメンバ m A および m B の具体化を通じ、
構成子 A::A および B::B を呼び出して、オブジェクト
S3対応のポインタthisに渡す。パラメータpunkOuter
の値がNULLであれば、構成子S3::S3は、(新たに具体化
したオブジェクトS3をポイントする)ポインタthisの
値にデータメンバ m punkOuter をセットする。パラメ
ータpunkOuter の値がNULLでない場合には、構成子S3::
S3はデータメンバ m punkOuter をパラメータpunkOuter
の値にセットする。データメンバ m punkOuter は、オ
ブジェクトS3が囲まれている場合には、集合体の制御
IUnknownインタフェースの値をポイントし、オブジェク
トS3が囲まれていない場合にはオブジェクトS3のIU
nknownインタフェースをポイントする。構成子S3::S3
は、データメンバ m refcountを0に初期化する。消去
関数S3::-S3 は、メソッドS1::Release を呼び出して、
囲まれたオブジェクトS1の参照カウントをディクリメ
ントする。オブジェクトS1の具体化を通じ、参照カウ
ントはすでに1にセットされているので、メソッドS1::
Release はオブジェクトS1を削除する。消去関数S3::
-S3 は、同様の方法でオブジェクトS2の参照カウント
をディクリメントする。
【0042】インタフェースAおよびBは、インタフェ
ースCのメソッドに同様の動作をする。こうしてインタ
フェースAおよびBは、オブジェクトS3が囲まれた場
合に提示できる。図5は、オブジェクトS3のデータ構
造レイアウトを示すブロック図である。このデータ構造
レイアウトは、インスタンスデータ501、仮想関数表
502、503および504、メソッド505乃至51
7、オブジェクトS1・401乃至413およびオブジ
ェクトS2・519とを含む。インスタンスデータ50
1は、制御IUnknownインタフェースとクラスAおよびB
のインスタンスであるデータメンバ m A および m B
と、オブジェクトS3のIUnknownインタフェースをポイ
ントするデータメンバ m punkOuter と、オブジェクト
S3対応の参照カウントを含むデータメンバ m refcou
ntと囲まれたオブジェクトS1のIUnknownをポイントす
るデータメンバ m punkS1と、囲まれたオブジェクトS
2・515のIUnknownインタフェースをポイントするデ
ータメンバ m punkS2とに対応した仮想関数表に対する
ポインタを含む。囲まれたオブジェクトS1が具体化さ
れると、そのデータメンバ S1::m punkOuter は初期化
され、オブジェクトS3のIUnknownインタフェースをポ
イントする。同様に囲まれたオブジェクトS2が具体化
されると、そのデータメンバ S2::m punkOuter は初期
化され、オブジェクトS3のIUnknownインタフェースを
ポイントする。
【0043】図6および図7は、囲んでいるオブジェク
トと囲まれたオブジェクトとの共同動作を示すブロック
図である。図6は、別のオブジェクトに囲まれていない
クラスS1のオブジェクトを示すブロック図である。ク
ラスS1のオブジェクト601には、データメンバ m
punkOuter を含み、これはIUnknownインタフェースおよ
びメソッド603、604、605および606をポイ
ントする。メソッドIUnknown::QueryInterface603
は、要求されたインタフェースに対するポインタを戻
し、参照カウントをインクリメントする。メソッド C::
QueryInterface605および C::AddRef606は、IUnk
nownインタフェースの対応するメソッドを呼び出す。
(図に示さない)クラスDのメソッドの処理系は、クラ
スCのものと同様である。図7は、クラスS1およびS
2のオブジェクトを囲むクラスS3のオブジェクトを示
す図である。オブジェクトS2は、オブジェクトS1と
同様であるが図に示していない。クラスS1のオブジェ
クト601のデータメンバ関数 m punkOuter 602は、
クラスS3のオブジェクト610のIUnknownインタフェ
ースをポイントする。メソッドIUnknown::QueryInterfa
ce613は、提示された各オブジェクトに対するポイン
タを戻し、データメンバ m punkS1・619によってポ
イントされるメソッドIUnknown::QueryInterface603
を呼び出し、インタフェースCに対するポインタを検索
する。クラスAおよびBのメソッドQueryInterface61
5および617は、データメンバ m punkOuter 612
によって示されるメソッドを呼び出す。
【0044】上述の本発明の実施例において、集合体の
制御IUnknownインタフェースのメソッドQueryInterface
は、囲まれたオブジェクトのIUnknownインタフェースの
メソッドQueryInterfaceを呼び出し、提示されたインタ
フェースに対するポインタを検索する。本発明の別の実
施例においては、囲んでいるオブジェクトが提示する囲
まれたオブジェクトのインタフェースに対するポインタ
を、囲んでいるオブジェクトを変換することができる。
このため、制御IUnknownのメソッドQueryInterfaceが呼
び出されると、このメソッドは、囲まれたオブジェクト
のIUnknownインタフェースのメソッドQueryInterfaceを
呼び出すというよりは、変換されたポインタを検索して
戻すことができる。この別の実施例を実現するためは、
囲んでいるオブジェクトによって、各変換されたポイン
タに対応したデータメンバを定義する。(一般に囲んで
いるオブジェクトの構成中に)囲まれたオブジェクトが
具体化された場合、囲まれたオブジェクトのIUnknownイ
ンタフェースのメソッドQueryInterfaceを呼び出して提
示されたインタフェースのポインタを検索する。検索さ
れたポインタが参照カウントされず、囲んでいるオブジ
ェクトが囲まれたオブジェクトに対して1つのポインタ
のみを効果的に維持することが好ましい(S3:: m punk
S1など)。囲まれたオブジェクトは、メソッドRelease
に対して1回のコールだけで削除することができる。し
たがって、ポインタを変換した後、囲まれたオブジェク
トのIUnknownインタフェースのメソッドRelease が呼び
出され、変換されたポインタに属する参照カウントを除
去する。
【0045】上述の本発明の実施例において、制御IUnk
nownインタフェースのメソッドQueryInterfaceの処理系
は、どのインタフェースが提示されるかを指定するswit
ch文を含む。例えば、メソッドS3::QueryInterfaceのsw
itch文は、提示された各インタフェースA、B、Cおよ
びFと制御IUnknownに対するcaseラベルを含む。このた
め、提示されたインタフェースは囲んでいるオブジェク
トの実現中に静的に定義される。別の実施例において
は、制御IUnknownインタフェースメソッドQueryInterfa
ceを囲まれたオブジェクトの外部インタフェースに関す
る知識を特に必要としなくても実現できる。実現しない
インタフェースに対するポインタを要求したとき、メソ
ッドQueryInterfaceは囲まれたオブジェクトのIUnknown
インタフェースのメソッドQueryInterfaceを呼び出し、
囲まれたオブジェクトによって実現されていれば、識別
されたインタフェースに対するポインタを検索する。コ
ード表5は、オブジェクトS3に対する制御IUnknownイ
ンタフェースのメソッドQueryInterfaceのC++処理系
であり、本発明の別の1実施例である。かこまれたオブ
ジェクトの外部インタフェースに対するポインタを戻す
ことに加えて、制御IUnknownのメソッドQueryInterface
は、他のすべての外部インタフェースを提示する一方
で、特定の外部インタフェースを提示せずに実現するこ
とができよう。
【0046】 コード表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が障害を示すフラッグを戻すな
ど)。
【0047】上述の実施例では、集合オブジェクト自体
が、囲んでいるオブジェクト内に囲まれたオブジェクト
となりうる。この囲い込み(ネスティング)は深さを問
わず起こりうる。また、集合オブジェクトが集合不可能
にすることもできる。クラスXXに対応する関数CreateIn
stanceXXは、パラメータpunkOuter がヌルでない場合、
すなわち、集合が所望される場合に障害を示すフラグを
戻すことができる。上述の実施例では、集合オブジェク
トの各外部インタフェースに対応するオブジェクトは、
集合オブジェクトのデータメンバとして、具体化され
る。これに代わる実施例では、集合オブジェクトのデー
タメンバとして実現されるよりむしろ、外部インタフェ
ースが集合オブジェクトによって継承される。コード表
6は、外部インタフェースCおよびDを有する集合クラ
スのC++クラス定義を含む。クラスS1は、抽象クラ
スICおよびIDを継承する。インタフェースICおよびIDの
処理系は導出クラスS1に対するポインタを格納してデ
ータメンバ m punkOuter にアクセスする必要はない。
逆に、インタフェースICおよびIDの処理系は、コード表
3に示すように、導出クラスに対するポインタをデータ
メンバ m pS1 に格納する。インタフェースを継承する
際に、他の処理系が可能であると評価する当業者もいる
ことだろう。
【0048】 コード表6 class S1:public IC,publicID { 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 ; } 本発明に関しては、好ましい態様を述べてきたが、本発
明をその態様のみ限定する意図はない。本発明の精神に
則った修正および変更は、当業者らによって明らかなも
のとなろう。本発明の適用範囲は添付の請求の範囲にお
いて定められる。
【0049】
【発明の効果】以上説明したように、本発明のオブジェ
クト集合方法およびシステムは、囲んでいるオブジェク
ト内に、囲まれたオブジェクトを集合させ、囲まれたオ
ブジェクトがオブジェクト管理インタフェースと外部イ
ンタフェースとを有し、囲んでいるオブジェクトが制御
オブジェクト管理インタフェースを有し、集合したオブ
ジェクトによってクライアントに提示されたインタフェ
ースが、インタフェースの識別子を受取り識別したイン
タフェースに参照を戻すための質問メンバ関数を有し、
囲んでいるオブジェクトのインスタンスを作成し、囲ん
でいるオブジェクトの制御オブジェクト管理インタフェ
ースの質問メンバ関数が囲んでいるオブジェクトによっ
て提示されたインタフェースの識別子を受け取って提示
されたインタフェースに対する参照を戻し、さらに、囲
まれたオブジェクトのインスタンスを作成し、囲まれた
オブジェクトの外部インタフェースの質問メンバ関数が
インタフェースの識別子を受取り、受け取った識別子を
渡して囲んでいるオブジェクトの制御オブジェクト管理
インタフェースの質問メンバ関数を呼び出し、囲んでい
るオブジェクトの制御オブジェクト管理インタフェース
の中から呼び出された質問メンバ関数によって戻される
参照を識別されたインタフェースの参照として戻すの
で、複雑な手続きを取らず所望のコードを共用し、プロ
グラム開発時のコストを低減させることができるという
効果がある。
【図面の簡単な説明】
【図1】オブジェクトの表現に使用する一般的なデータ
構造を示すブロック図である。
【図2】スプレッドオブジェクトのサンプルデータ構造
を示すブロック図である。
【図3】本発明による集合オブジェクトを示すブロック
図である。
【図4】本発明によるクラスS1のオブジェクトのイン
スタンスのデータ構造レイアウトのブロック図である。
【図5】本発明によるオブジェクトS3のデータ構造レ
イアウトを示すブロック図である。
【図6】本発明による別のオブジェクトに囲まれていな
いクラスS1のオブジェクトを示すブロック図である。
【図7】本発明によるクラスS1およびS2のオブジェ
クトを囲むクラスS3のオブジェクトを示す図である。
【符号の説明】
101 インスタンスデータ構造 102、202、205、206、402、403、4
03A、502、503、504 仮想関数表 103、104、105 メンバ関数 201 オブジェクトデータ構造 203 IBasicインタフェースデータ構造 204 IBasicインタフェースデータ構造 207、208、209、210、211、212、2
13、214、215、216、217、218、21
9、220、221 メソッド 222 形式 301 囲んでいるオブジェクトS3 302 囲まれたオブジェクトS2 303 囲まれたオブジェクトS1 304 処理系I3 401 インスタンス構造 404、405、406、406、408 関数 409、410、411、412 クラスCのメンバ関
数 413、414、415、416 クラスDのメンバ関
数 501 インスタンスデータ 505、506、507、508、509、510、5
11、512、513、514、515、516、51
7、603、604、605、606、613、61
5、617 メソッド 519 オブジェクトS2 601 クラスS1のオブジェクト 602 データメンバ関数 610 クラスS3のオブジェクト 612 データメンバ 619 データメンバ
───────────────────────────────────────────────────── フロントページの続き (72)発明者 スリニヴァサ アール コッポル アメリカ合衆国 ワシントン州 98053 レッドモンド トゥーハンドレッドアンド サーティシックスス アベニュー ノース イースト 2402 (72)発明者 バリー ビー マッキカン アメリカ合衆国 ワシントン州 98110 ベインブリッジ アイランド マンザニー タ ロード ノースイースト 12730 (72)発明者 クレイグ ウィッテンバーグ アメリカ合衆国 ワシントン州 98040 マーサー アイランド マーサー テラス ドライヴ 7525

Claims (24)

    【特許請求の範囲】
  1. 【請求項1】 囲まれたオブジェクトは、オブジェクト
    管理インタフェースおよび外部インタフェースを有し、
    囲んでいるオブジェクトは、制御オブジェクト管理イン
    タフェースを有し、各インタフェースは、インタフェー
    スの識別子を受け取るための質問メンバ関数と識別済の
    インタフェースに参照を戻すことによって、コンピュー
    タシステム内で、前記囲まれるオブジェクトを前記囲ん
    でいるオブジェクト内に集合させるためのオブジェクト
    集合方法において、 囲んでいるオブジェクトのインスタンスを作成すること
    によって、囲んでいるオブジェクトの制御オブジェクト
    管理インタフェースの質問メンバ関数が囲まれたオブジ
    ェクトの外部インタフェースの識別子を受取り、外部イ
    ンタフェースへ参照を戻すステップと、 囲まれたオブジェクトのインスタンスを作成して、囲ま
    れたオブジェクトの外部インタフェースの質問メンバ関
    数がインタフェースの識別子を受取り、該受け取られた
    識別子を渡す囲んでいるオブジェクトの制御オブジェク
    ト管理インタフェースのメンバ関数を呼び出し、囲んで
    いるオブジェクトの制御オブジェクト管理インタフェー
    スの呼び出された質問メンバ関数によって戻される参照
    を識別済のインタフェースに対する参照として戻すステ
    ップと、 を有することを特徴とするオブジェクト集合方法および
    システム。
  2. 【請求項2】 前記オブジェクトが集合オブジェクトで
    あることを特徴とする請求項1記載のオブジェクト集合
    方法およびシステム。
  3. 【請求項3】 前記集合オブジェクトが集合可能なオブ
    ジェクトでないことを特徴とする請求項1記載のオブジ
    ェクト集合方法およびシステム。
  4. 【請求項4】 前記囲まれたオブジェクトの制御オブジ
    ェクト管理インタフェースの質問メンバ関数が該囲まれ
    たオブジェクトの外部インタフェースに関し、特定知識
    を有さないことを特徴とする請求項1記載のオブジェク
    ト集合方法およびシステム。
  5. 【請求項5】 前記囲んでいるオブジェクトの制御オブ
    ジェクト管理インタフェースの質問メンバ関数が囲まれ
    たオブジェクトの外部インタフェースに関する特定知識
    を有さないことを特徴とする請求項1記載のオブジェク
    ト集合方法およびシステム。
  6. 【請求項6】 前記囲んでいるオブジェクトの制御オブ
    ジェクト管理インタフェースの質問メンバ関数が囲まれ
    たオブジェクトのオブジェクト管理インタフェースの質
    問メンバ関数を呼び出して、該囲まれたオブジェクトの
    外部インタフェースに対する参照を検索することを特徴
    とする請求項1記載のオブジェクト集合方法およびシス
    テム。
  7. 【請求項7】 前記囲んでいるオブジェクトが囲まれて
    いるオブジェクトの外部インタフェースを格納して、囲
    んでいるオブジェクトの制御オブジェクト管理インタフ
    ェースの質問メンバ関数が該格納された参照を囲まれた
    オブジェクトの外部インタフェースとして戻すことを特
    徴とする請求項1記載のオブジェクト集合方法およびシ
    ステム。
  8. 【請求項8】 クラスはオブジェクト管理インタフェー
    スおよび外部インタフェースを有し、該オブジェクト管
    理インタフェースと外部インタフェースは各インタフェ
    ースにアクセスするための質問メンバ関数を有し、集合
    オブジェクトを定義するクラスを実現するコンピュータ
    システムに関するオブジェクト集合方法およびシステム
    において、 作成インスタンスメンバ関数を生成しクラスのオブジェ
    クトを具体化し、作成インスタンスメンバ関数がオブジ
    ェクトを集合させない場合にはクラスのデータメンバ中
    にクラスのオブジェクト管理インタフェースに対する参
    照を格納し、データを集合させる場合にはクラスのデー
    タメンバ中に囲んでいるオブジェクトの制御オブジェク
    ト管理インタフェースに対する参照を格納するステップ
    と、 オブジェクト管理インタフェースの質問メンバ関数を生
    成することによって、質問メンバ関数がインタフェース
    の識別子を受取り、識別されたインタフェースに対して
    参照を戻すステップと、 外部インタフェースの質問メンバ関数を生成して、質問
    メンバ関数がインタフェースの識別子を受取り、該イン
    タフェースの識別子を渡すデータメンバによって参照を
    付せられたオブジェクト管理インタフェースを呼び出
    し、該呼び出された質問メンバ関数によって戻される参
    照を戻すステップと、 を有することを特徴とするオブジェクト集合方法および
    システム。
  9. 【請求項9】 クラスのオブジェクトを実現化するため
    のグローバル作成インスタンス関数を生成し、グローバ
    ル作成インスタンス関数が作成インスタンスメンバ関数
    を呼び出しクラスのインスタンスを作成し、かつ、オブ
    ジェクト管理インタフェースから質問メンバ関数を呼び
    出しクラスの外部インタフェースに対する参照を検索す
    ることによって、グローバル作成インスタンス関数をク
    ライアントによって呼び出し、クライアントがクラスに
    対するクラス定義にアクセスする必要なく、クラスのイ
    ンスタンスを作成するステップを有することを特徴とす
    る請求項5記載のオブジェクト集合方法およびシステ
    ム。
  10. 【請求項10】 集合オブジェクトを作成し、集合オブ
    ジェクトは囲まれたオブジェクトを有し、囲まれたオブ
    ジェクトは集合体によって提示される外部インタフェー
    スを有するオブジェクト集合方法およびシステムにおい
    て、 集合オブジェクトを具体化し、集合オブジェクトが質問
    メンバ関数を有して、集合オブジェクトによって提示さ
    れたインタフェースに対する参照を検索するステップ
    と、 囲まれたオブジェクトを具体化し、囲まれたオブジェク
    トが外部インタフェースの質問メンバ関数を有し、集合
    オブジェクトによって提示されたインタフェースに対す
    る参照を検索するステップと、 囲まれたオブジェクトに対する参照を格納し、集合オブ
    ジェクトの質問メンバ関数は囲まれたオブジェクトに対
    して格納した参照を使用し、提示された外部インタフェ
    ースに対する参照を検索するステップと、 集合オブジェクトに対する参照を格納し、外部インタフ
    ェースの質問メンバ関数は集合オブジェクトに対して格
    納した参照を集合オブジェクトによって提示されたイン
    タフェースに対する参照を検索するステップと、 を有することを特徴とするオブジェクト集合方法および
    システム。
  11. 【請求項11】 前記囲まれたオブジェクトに対して格
    納した参照が、質問メンバ関数を有する囲まれたオブジ
    ェクトのオブジェクト管理インタフェースに対する参照
    であり、集合オブジェクトの質問メンバ関数が参照され
    たオブジェクト管理インタフェースの質問メンバ関数を
    呼び出し、提示された外部インタフェースに対する参照
    を検索するステップを有することを特徴とする請求項1
    0記載のオブジェクト集合方法およびシステム。
  12. 【請求項12】 前記囲まれたオブジェクトに対して格
    納した参照は、囲まれたオブジェクトの外部インタフェ
    ースに対する参照であり、集合オブジェクトの質問メン
    バ関数は、外部インタフェースに対する参照を提示され
    た外部インタフェースに対する参照として使用するステ
    ップを有することを特徴とする請求項10記載のオブジ
    ェクト集合方法およびシステム。
  13. 【請求項13】 前記外部インタフェースの質問メンバ
    関数は集合オブジェクトに対して格納した参照を使用
    し、集合オブジェクトの質問メンバ関数を呼び出し、集
    合オブジェクトによって提示されたインタフェースに対
    する参照を検索するステップを有することを特徴とする
    請求項10記載のオブジェクト集合方法およびシステ
    ム。
  14. 【請求項14】 前記囲まれたオブジェクトに対して格
    納した参照が質問メンバ関数を有する囲まれたオブジェ
    クトのオブジェクト管理インタフェースに対する参照で
    あり、集合オブジェクトの質問メンバ関数が参照オブジ
    ェクト管理インタフェースの質問メンバ関数を呼び出
    し、提示された外部インタフェースに対する参照を検索
    することを特徴とする請求項13記載のオブジェクト集
    合方法およびシステム。
  15. 【請求項15】 前記外部インタフェースが加算参照を
    供給し、参照計数メンバ関数を解放し、集合オブジェク
    トが加算参照を供給し参照計数関数を解放し、囲まれた
    オブジェクトの外部インタフェースの参照計数メンバ関
    数が集合オブジェクトの参照計数メンバ関数を呼び出す
    ステップを有することを特徴とする請求項10記載のオ
    ブジェクト集合方法およびシステム。
  16. 【請求項16】 囲んでいるオブジェクト内に囲まれた
    オブジェクトを囲み、囲んでいるオブジェクトが質問メ
    ンバ関数を有し、囲まれたオブジェクトは質問メンバ関
    数を有し、それぞれの質問メンバ関数が、囲んでいるオ
    ブジェクトによって提示されたインタフェースに対する
    参照を検索し、囲まれたオブジェクトは囲んでいるオブ
    ジェクトによって提示された外部インタフェースを有す
    るオブジェクト集合方法およびシステムにおいて、 囲んでいるオブジェクトを具体化するステップと、 囲まれたオブジェクトを具体化するステップと、 囲んでいるオブジェクト内に囲まれたオブジェクトに対
    する参照を格納するステップとを有し、 囲んでいるオブジェクトの質問メンバ関数を実行する場
    合に、囲まれたオブジェクトの質問メンバ関数を呼び出
    し、囲まれたオブジェクトに対して格納した参照を利用
    して囲まれたオブジェクトの提示された外部インタフェ
    ースに対する参照を検索することを特徴とするオブジェ
    クト集合方法およびシステム。
  17. 【請求項17】 囲んでいるオブジェクトに対して提示
    されたインタフェースに対する複数の参照を反映する囲
    んでいるオブジェクト内に参照カウントを維持するステ
    ップを有することを特徴とする請求項16記載のオブジ
    ェクト集合方法およびシステム。
  18. 【請求項18】 囲んでいるオブジェクト内に囲まれた
    オブジェクトを囲み、囲んでいるオブジェクトが質問メ
    ンバ関数を有し、囲まれたオブジェクトは質問メンバ関
    数を有し、それぞれの質問メンバ関数が、囲んでいるオ
    ブジェクトによって提示されたインタフェースに対する
    参照を検索し、囲まれたオブジェクトは囲んでいるオブ
    ジェクトによって提示された外部インタフェースを有す
    るオブジェクト集合方法およびシステムにおいて、 囲んでいるオブジェクトを具体化するステップと、 囲まれたオブジェクトを具体化するステップと、 囲まれたオブジェクト内に囲んでいるオブジェクトに対
    する参照を格納するステップとを有し、 囲まれたオブジェクトの質問メンバ関数を実行する場合
    に、囲んでいるオブジェクトの質問メンバ関数を呼び出
    し、囲んでいるオブジェクトに対して格納した参照を利
    用して囲まれたオブジェクトの提示されたインタフェー
    スに対する参照を検索することを特徴とするオブジェク
    ト集合方法およびシステム。
  19. 【請求項19】 囲んでいるオブジェクトに対して提示
    されたインタフェースに対する複数の参照を反映する囲
    んでいるオブジェクト内に参照カウントを維持するステ
    ップを有することを特徴とする請求項18記載のオブジ
    ェクト集合方法およびシステム。
  20. 【請求項20】 囲まれたオブジェクトの質問メンバ関
    数を囲まれたオブジェクトの外部インタフェースに対応
    させ、囲まれたオブジェクトが質問メンバ関数を備えた
    オブジェクト管理インタフェースを有し、囲んでいるオ
    ブジェクトの質問メンバ関数が囲まれたオブジェクトの
    オブジェクト管理インタフェースに質問メンバ関数を呼
    び出し、囲まれたオブジェクトの外部インタフェースに
    対する参照を検索することを特徴とするオブジェクト集
    合方法およびシステム。
  21. 【請求項21】 集合オブジェクトが囲まれたオブジェ
    クトと囲んでいるオブジェクトを有し、囲んでいるオブ
    ジェクトが参照カウントと加算参照メンバ関数と解放メ
    ンバ関数とを有し、囲まれたオブジェクトが加算参照メ
    ンバ関数と解放参照メンバ関数とを有し、集合オブジェ
    クトに対して参照の計数を行なうオブジェクト集合方法
    およびシステムにおいて、 囲まれたオブジェクトの加算参照メンバ関数の制御下
    で、囲んでいるオブジェクトの加算メンバ関数を呼び出
    し、囲んでいるオブジェクトの加算参照メンバ関数が参
    照カウントをインクリメントするステップと、 囲まれたオブジェクトの解放参照メンバ関数の制御下
    で、囲んでいるオブジェクトの解放参照メンバ関数を呼
    び出し、囲んでいるオブジェクトの解放参照メンバ関数
    が参照カウントをディクリメントするステップと、 を有することを特徴とするオブジェクト集合方法および
    システム。
  22. 【請求項22】 参照カウントが集合オブジェクトに対
    する参照が存在しないことを示した場合、囲んでいるオ
    ブジェクトと囲まれたオブジェクトを削除することを特
    徴とするオブジェクト集合方法およびシステム。
  23. 【請求項23】 クラスがオブジェクト管理インタフェ
    ースと外部インタフェースとを有し、オブジェクト管理
    インタフェースと外部インタフェースがそれぞれ質問メ
    ンバ関数を有して、集合可能なオブジェクトのインタフ
    ェースにアクセスし、集合可能なオブジェクトを定義す
    るクラスを実現するコンピュータシステムに関するオブ
    ジェクトの集合方法およびシステムにおいて、 外部インタフェースを定義するステップと、 集合可能なクラスを定義し、集合可能なクラスが定義さ
    れた外部インタフェースを基本クラスとして継承し、集
    合クラスが定義された外部インタフェースの質問メンバ
    関数の処理系を有し、オブジェクトを集合させていない
    場合には、定義された外部インタフェースの質問メンバ
    関数がオブジェクト管理インタフェースを呼び出し、集
    合可能なオブジェクトを集合させている場合には、集合
    しているオブジェクトの質問メンバ関数を呼び出すこと
    を特徴とするステップと、 を有することを特徴とするオブジェクト集合方法および
    システム。
  24. 【請求項24】 コンピュータシステムの集合可能なオ
    ブジェクトが、 オブジェクトのインタフェースの識別子を受取り、イン
    タフェースに対して参照を戻すための質問メンバ関数を
    有するオブジェクト管理インタフェースと、 インタフェースの識別子を受取り、オブジェクトを集合
    させていない場合にはオブジェクト管理インタフェース
    の質問メンバ関数を呼び出し、オブジェクトを集合させ
    ている場合には、囲んでいるオブジェクトの質問メンバ
    関数を呼び出し、識別されたインタフェースに対する参
    照を戻すための質問メンバ関数を有する外部インタフェ
    ースと、 を含むことを特徴とするオブジェクト集合方法およびシ
    ステム。
JP32811493A 1992-12-24 1993-12-24 オブジェクト集合方法およびシステム Expired - Lifetime JP3672334B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US99655292A 1992-12-24 1992-12-24
US07/996552 1992-12-24

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2002142748A Division JP4084956B2 (ja) 1992-12-24 2002-05-17 オブジェクト集合方法およびシステム

Publications (2)

Publication Number Publication Date
JPH06282433A true JPH06282433A (ja) 1994-10-07
JP3672334B2 JP3672334B2 (ja) 2005-07-20

Family

ID=25543042

Family Applications (2)

Application Number Title Priority Date Filing Date
JP32811493A Expired - Lifetime JP3672334B2 (ja) 1992-12-24 1993-12-24 オブジェクト集合方法およびシステム
JP2002142748A Expired - Lifetime JP4084956B2 (ja) 1992-12-24 2002-05-17 オブジェクト集合方法およびシステム

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2002142748A Expired - Lifetime JP4084956B2 (ja) 1992-12-24 2002-05-17 オブジェクト集合方法およびシステム

Country Status (5)

Country Link
EP (1) EP0603880B1 (ja)
JP (2) JP3672334B2 (ja)
AT (1) ATE193132T1 (ja)
CA (1) CA2113417C (ja)
DE (1) DE69328664T2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5819279A (en) * 1995-04-27 1998-10-06 Fujitsu Limited Object data processing apparatus
JP2011511987A (ja) * 2008-02-07 2011-04-14 マイクロソフト コーポレーション 反復コンポーネントのバインディング

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5805885A (en) 1992-12-24 1998-09-08 Microsoft Corporation Method and system for aggregating objects
DE69508627T2 (de) * 1995-03-20 2000-04-06 Object Technology Licensing Corp. Laufzeitsystem eines betriebssystems mit unterstützung von binärkompatibilität zwischen versionen
EP0841612A3 (en) * 1996-11-08 2003-05-28 International Business Machines Corporation Framework for software development
US6125364A (en) * 1997-11-06 2000-09-26 International Business Machines Corporation Flexible object persistence framework using data cursor objects loaded from superclasses
US6487551B2 (en) 1998-09-24 2002-11-26 International Business Machines Corporation Externalizing very large objects in a relational database client/server environment
US6564368B1 (en) 1998-10-01 2003-05-13 Call Center Technology, Inc. System and method for visual application development without programming
US6397384B1 (en) * 1998-12-18 2002-05-28 Adobe Systems Incorporated Run-time addition of interfaces
US6877163B1 (en) * 1999-06-14 2005-04-05 Sun Microsystems, Inc. Method and system for dynamic proxy classes
JP2009271770A (ja) * 2008-05-08 2009-11-19 Sumitomo Heavy Ind Ltd プログラミング装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AU628264B2 (en) * 1990-08-14 1992-09-10 Oracle International Corporation Methods and apparatus for providing a client interface to an object-oriented invocation of an application

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5819279A (en) * 1995-04-27 1998-10-06 Fujitsu Limited Object data processing apparatus
JP2011511987A (ja) * 2008-02-07 2011-04-14 マイクロソフト コーポレーション 反復コンポーネントのバインディング

Also Published As

Publication number Publication date
CA2113417A1 (en) 1994-06-25
DE69328664D1 (de) 2000-06-21
JP2003022186A (ja) 2003-01-24
JP4084956B2 (ja) 2008-04-30
JP3672334B2 (ja) 2005-07-20
EP0603880B1 (en) 2000-05-17
DE69328664T2 (de) 2000-08-31
CA2113417C (en) 2000-02-22
EP0603880A3 (en) 1995-08-16
ATE193132T1 (de) 2000-06-15
EP0603880A2 (en) 1994-06-29

Similar Documents

Publication Publication Date Title
JP4322967B2 (ja) オブジェクト集合方法及びシステム
US7225426B2 (en) Dynamic objects with property slot definition and runtime mechanisms
JP4070248B2 (ja) オブジェクト接続を動的に発生する方法及びシステム
EP0669020B1 (en) Methods for marshalling interface pointers for remote procedure calls
US5752034A (en) Apparatus and method for providing an event detection notification service via an in-line wrapper sentry for a programming language
US7219329B2 (en) Systems and methods providing lightweight runtime code generation
US6606742B1 (en) Object-oriented interface for portability to diverse operating systems or hardware platforms
EP0700538B1 (en) Object-oriented host system
KR101795844B1 (ko) 런타임 시스템
US5896532A (en) Objects with run-time classes and methods of making them
US6209040B1 (en) Method and system for interfacing to a type library
JP4084956B2 (ja) オブジェクト集合方法およびシステム
US20090077536A1 (en) Programming environment with support for handle and non-handle user-created classes
Squyres et al. Object oriented MPI (OOMPI): A C++ class library for MPI
US20040093586A1 (en) Method and system for automatic code generation accessing functionality in a remote process

Legal Events

Date Code Title Description
A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20020624

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20041005

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20041012

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20050104

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20050419

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090428

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20090428

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20100428

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110428

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120428

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120428

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130428

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140428

Year of fee payment: 9

EXPY Cancellation because of completion of term