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

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

Info

Publication number
JP4084956B2
JP4084956B2 JP2002142748A JP2002142748A JP4084956B2 JP 4084956 B2 JP4084956 B2 JP 4084956B2 JP 2002142748 A JP2002142748 A JP 2002142748A JP 2002142748 A JP2002142748 A JP 2002142748A JP 4084956 B2 JP4084956 B2 JP 4084956B2
Authority
JP
Japan
Prior art keywords
interface
enclosed
enclosing
member function
cpu
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Lifetime
Application number
JP2002142748A
Other languages
English (en)
Other versions
JP2003022186A (ja
Inventor
ダグラス ホッジス シー
アール コッポル スリニヴァサ
ビー マッキカン バリー
ウィッテンバーグ クレイグ
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 JP2003022186A publication Critical patent/JP2003022186A/ja
Application granted granted Critical
Publication of JP4084956B2 publication Critical patent/JP4084956B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR 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)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Making Paper Articles (AREA)
  • Organic Low-Molecular-Weight Compounds And Preparation Thereof (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Description

【0001】
【産業上の利用分野】
本発明は、一般にコンピュータにおいてオブジェクトに対する干渉を実行する方法およびシステムに関し、特に、オブジェクトを集合させる方法に関する。
【0002】
【従来の技術】
コンピュータソフトウェアシステムが複雑になるにつれ、ソフトウェアを開発するためのコストも増加している。ソフトウェア開発コストを最小限にするために、開発者らはコードを共用することが多い。従来の開発技術では、3つのタイプのコードを共用する。すなわち、(1)ソースコードの共用、(2)コンパイル済コードの共用、(3)継承中のコード共用、である。
ソースコードおよびコンパイル済コードを共用する方法は、長年広く使用されてきた。ソースコードの共用とは、さまざまなコンピュータプログラムまたは同一のコンピュータプログラムのさまざまなバージョンで同一のコードを使用することである。例えば、一般にスプレッドシートプログラムは、スップレッドシート表示を制御するソースコードを含む。ワードプロセッシングプログラムでスプレッドシートを文章内に埋め込むことができれば、そのワードプロセッシングプログラムは同一の(またはわずかに修正した)ソースコードを使用して、埋め込んだスプレッドシートオブジェクトを表示することができる。ソースコードは、一般に単独の開発者が複数のコンピュータプログラムを開発する際に共用される。他者と競争する関係上、開発者は他の開発者とコードを共用しない。さらに、コードを共用する場合でさえ、ソースコード受信者はソースコードを修正するのが一般的であり、この結果、ソースコードに対し2つのバージョンが維持されることになる。
【0003】
コンパイル済コードの共用とは、さまざまなコンピュータプログラムで同一のコンパイル済コードを使用することである。一般に、コンパイル済コードは静的リンクライブラリまたは動的リンクライブラリに格納される。静的リンクライブラリに格納されたコードは、実行前にコンピュータプログラムを連係した場合に共用される。例えば、スペルチェックプログラムの開発者は、そのプログラムをコンパイルして静的リンクライブラリにコンパイル済コードを格納することによってコンパイル済コードを共用できる。その後、静的リンクライブラリをワードプロセッシングプログラム開発者に分散することによって、これらの開発者はコンパイル済スペルチェックコードをそれぞれのワードプロセッシングプログラムに連係することができる。一般に、スペルチェックプログラム開発者は、コンパイル済コード修正して、特定開発者の特殊な要求に応じなければならない。こうした修正によって、コンパイル済コードの複雑化(とサイズの増大)を助長するだけでなく、他の受信者の要求と矛盾する可能性もある。他に、開発者が、静的リンクライブラリの複数のバージョンを分散することも考えられる。しかし複数のバージョンを保守するにはコストがかかりかねない。
【0004】
オブジェクト指向プログラミング技術には、継承という概念があり、コードの共用を許容することを意味する。この継承という概念を理解するには、一般に、オブジェクト指向プログラム技術を理解することが有益である。オブジェクト指向プログラミング言語では、データのカプセル化とデータ型の継承を支援するという2つの特徴が一般に知られている。データのカプセル化とは、関数とデータを結合させることである。継承は、あるデータ型を別のデータ型で宣言することである。
C++言語では、オブジェクト指向言語をクラスを使用して支援する。クラスはユーザが定義した型である。クラスの宣言によって、クラスのデータメンバとメンバ関数が定義される。例えば、下記の宣言はCIRCLEというクラスのデータメンバとメンバ関数とを定義する。
class CIRCLE
{ public:
int x, y;
int radius;
void draw();

変数xおよびyは、円の中心座標を指定し、変数radiusはその円の半径を指定する。これらの変数をクラスCIRCLEのデータメンバという。関数drawは、ユーザが定義した関数で、指定座標から指定した半径で円を描く。この関数drawをクラスCIRCLEのメンバ関数という。あるクラスのデータメンバとメンバ関数を結合させると、関数がクラスのインスタンスで動作する。クラスのインスタンスは、クラスのオブジェクトとも呼ばれる。
【0005】
C++の構文では、下記のステートメントが、オブジェクトaおよびbがクラスCIRCLE型であることを宣言する。
CIRCLE a, b;
この宣言は、オブジェクトaおよびbにメモリを割り当てる。下記のステートメントは、オブジェクトaおよびbのデータメンバにデータを割り当てる。
a. x =2;
a. y =2;
a. radius =1;
b. x =4;
b. y =5;
b. radius =2;
下記のステートメントは、オブジェクトaおよびbによって定義される円を描く際に用いられる。
a. draw();
b. draw();
導出クラスは、その基本クラスの特性、すなわちデータメンバとメンバ関数を継承するクラスである。例えば、下記の導出クラスCIRCLE FILLは、基本クラスCIRCLEを継承する。
【0006】
class CIRCLE FILL:CIRCLE
{ public:
int pattern;
void fill();
};
この宣言によって、クラスCIRCLE FILLが、クラスCIRCLE FILLの宣言時に導入したデータメンバとメンバ関数の他に、クラスCIRCLEに存在するすべてのデータメンバとメンバ関数、つまり、データメンバ patternとメンバ関数fillを含むことを指定する。ここでは、クラスCIRCLE FILLがデータメンバx、y、radiusならびにメンバ関数drawおよびfillを有している。この時、クラスCIRCLE FILLは、クラスCIRCLEの特性を「継承する」と言う。他のクラスの特性を継承するクラスが、導出クラス(CIRCLE FILLなど)である。他のクラスの特性を継承しないクラスを一次クラス(ルートクラス)という(CIRCLEなど)。他クラスによって特性が継承されるクラスは、基本クラスである(例えば、CIRCLEは、CIRCLE FILLの基本クラスである)。導出クラスは、複数のクラス特性を継承することができる。つまり、導出クラスは複数の基本クラスを有することができる。これを多重継承という。
【0007】
導出クラスは、基本クラスが仮想的に継承されるものであることを指定することができる。基本クラスの仮想継承とは、仮想基本クラスのインスタンスが導出クラス中の1つしか存在しないことを意味する。例えば、下記は非仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : CIRCLE { , , ,};
class CIRCLE 2 : CIRCLE { , , ,};
class PATTERN : CIRCLE 1, CIRCLE 2 { , , ,};
この宣言では、クラスPATTERN は非仮想的に2度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。つまり、クラスPATTERN にはクラスCIRCLEのインスタンスが2つ存在するのである。
下記は、2つの仮想基本クラスを有する導出クラスの1例である。
class CIRCLE 1 : virtual CIRCLE { , , ,};
class CIRCLE 2 : virtual CIRCLE { , , ,};
class PATTERN : CIRCLE 1, CIRCLE 2 { , , ,};
導出クラスPATTERN は、仮想的に2度クラスCIRCLE 1 およびCIRCLE 2 によってクラスCIRCLEを継承する。クラスCIRCLEは、2度仮想的に継承されるので、導出クラスPATTERN には、クラスCIRCLEのオブジェクトが1つしか存在しないことになる。クラス導出が複雑な場合に、仮想継承が非常に有益であると評価する当業者もいるであろう。
【0008】
クラスは、そのメンバ関数仮想的であるかどうかによっても指定することができる。あるメンバ関数が仮想的であると宣言することは、その関数が導出クラスにおいて同一名および同一型の関数によって優先され得ることを意味する。下記の例では、関数drawをクラスCIRCLEとCIRCLE FILLで仮想的であると宣言している。
class CIRCLE
{ public:
int x, y;
int radius;
virtual void draw();
};
class CIRCLE FILL:CIRCLE
{ public;
int pattern;
virtual void draw();
};
C言語は、ポインタデータ型を提供する。ポインタはメモリ中のオブジェクトのアドレス値を保持する。ポインタを介在に、オブジェクトに参照を付することができる。下記のステートメントは、変数 c ptr がクラスCIRCLE型のオブジェクトのポインタであることを宣言し、変数 c ptr をセットしてオブジェクトのアドレスを保持する。
【0009】
CIRCLE *c ptr
c ptr = &c;
この例に続き、下記のステートメントは、オブジェクトaがクラスCIRCLE型であり、オブジェクトbがクラスCIRCLE FILL型であることを宣言する。
CIRCLE a ;
CIRCLE FILL b;
下記のステートメントは、クラスCIRCLEで定義したように、関数drawに適用される。
a. draw() ;
一方、下記のステートメントは、クラスCIRCLE FILLで定義した関数drawに適用される。
b. draw() ;
さらに、下記のステートメントは、キャストオブジェクトbをクラスCIRCLE型のオブジェクトに分類し、クラスCIRCLE FILLで定義した関数drawを呼び出す。
CIRCLE *c ptr;
c ptr = &b;
c ptr->draw() ; // CIRCLE FILL :: draw()
このため、呼び出される仮想関数は、CIRCLE FILL::drawである。
【0010】
図1は、オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。オブジェクトはインスタンスデータ(データメンバ)およびメンバ関数であり、オブジェクトを実際に動作させる。オブジェクトの表現に使用するデータ構造は、インスタンスデータ構造101と、仮想関数表102と、メンバ関数103、104および105から成る。インスタンスデータ構造101は、仮想関数表102に対するポインタとデータメンバを含む。仮想関数表102は、オブジェクトに対して定義した各仮想メンバ関数のエントリを含む。各エントリは、対応するメンバ関数を提供するコードへの参照を含む。このサンプルオブジェクトのレイアウトは、米国特許出願第07/682,537 号「A Methodfor Implementing Virtual Function and Virtual Bases in a Compiler for anObject Oriented Programming Language」に従っており、本明細書中に参照として取り入れた。
以下において、オブジェクトを、C++プログラミング言語で定義したクラスのインスタンスとして述べる。当業者には、オブジェクトは他のプログラミング言語を使用して定義できると評価するものもいる。
クラスの継承は、コード共用の1形式である。クラス開発者は、他の開発者にクラスの実装( implementation を提供することができる。この他の開発者は、提供されたクラスから導出するクラスを作成することができる。ただし、クラスが継承されて、仮想関数が優先される場合は、優先する仮想関数のテストは複雑になることが考えられる。優先仮想関数は、非優先関数に影響を与えながら、オブジェクトの状態を修正する。このため、各継承関数は、優先仮想関数のテストと同時に独立したテストをする必要がある。テストの複雑さを改善するには、クラス実装の開発者は実装でソースコードを分散することができる。残念ながら、ソースコードを分散すると、上述のように、共用ソースコードに同様の支障が生じる。
【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;

スプヘレッドシートプログラムの開発者は、インタフェースの実装を供給して、スプレッドシートオブジェクトをワードプロセッシング文書に埋め込ませる必要があるだろう。ワードプロセッシングプログラムによってスプレッドシートオブジェクトを埋め込ませる場合、そのプログラムはスプレッドシートオブジェクトに対するインタフェースを実現するコードにアクセスしなければならない。
そのコードにアクセスするために、各実装には独特のクラス識別子が与えられる。例えば、Microsoft Corporation が開発したスプレッドシートオブジェクトは、「MSSpreadsheet 」というクラス識別子を有することができる。また、他社開発のスプレッドシートオブジェクトは、「LTSSpreadsheet」という識別子を有することができる。各コンピュータシステムでは常駐登録簿を維持して、各クラス識別子をクラスを実現するコードにマップする。一般に、スプレッドシートプログラムがコンピュータシステムにインストールされると、常駐登録簿を更新し、スプレッドシートオブジェクトのクラスの可用性を反映する。スプレッドシート開発者がインタフェースによって定義した各メンバ関数を処理し常駐登録簿を維持する限り、ワードプロセッシングプログラムは開発者のスプレッドシートオブジェクトをワードプロセッシング文書に埋め込むことができる。
【0013】
しかし、さまざまなスプレッドシート開発者が特定のメンバ関数のみ実行したいと願っていることだろう。例えば、あるスプレッドシート開発者はデータベース支援を実行したくないが、その他のメンバ関数は支援したいと考えているかもしれない。オブジェクトを埋め込むことができる上に、スプレッドシートの開発者がメンバ関数の一部のみを支援できるようにするには、スプレッドシートオブジェクトに対して複数のインタフェースを定義する。インタフェース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を実行したいと考えるであろう。
【0014】
実行時において、ワードプロセッシングプログラムは埋め込むべきスプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを決定しなくてはならなくなる。この決定の際に、別のインタフェースをどのインタフェースをオブジェクトに埋め込むことができるかを指示するメンバ関数を用いて(すべてのスプレッドシートオブジェクトが実行することを)定義する。このインタフェースはIUnknownという名で、(未確認インタフェースあるいはオブジェクト管理インタフェースと呼ばれ、)下記のように定義される。
class IUnknown
{ virtual boolean QueryInterface(REFIID iid, void**ppv) = 0;
virtual void AddRef() = 0;
virtual void Release() = 0;

このIUnknownインタフェースは、メンバ関数(メソッド)QueryInterfaceを定義する。メソッドQueryInterfaceは、(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は、ポインタをIBasicインタフェースとIDatabase インタフェースの仮想関数表へそれぞれポイントする。インタフェースへのポインタが戻されると、メソッドQueryInterfaceは(以下の) メソッドAddRefを呼び出し、クラスXXのオブジェクトに対する参照カウント値をインクリメントする。
【0016】
コード表2
void XX : : AddRef(){refcount++ ;}
void XX : : Release() {if(--refcount==0)delete this ;}
インタフェースIUnknownは、メソッドAddRefおよびRelease も定義する。これらは、参照カウントの実行に使用される。インタフェースに対し新たな参照を作成する度に、メソッドAddRefを呼び出し、オブジェクトの参照カウント値をインクリメントする。参照が不要になる度に、メソッドRelease を呼び出し、オブジェクトの参照値をディクリメントし、参照値が0になった場合にはオブジェクトの割当てを解除する。コード表2は、クラスXXに対応するメソッドAddRefおよびRelease の一般的な実装に対するC++のソースコードを含み、クラスIUnknownを継承する。
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インタフェースおよびIDatabase インタフェースに対するポインタとを含む。仮想関数表202の各エントリは、IUnknownインタフェースのメソッドへのポインタを含む。IBasicインタフェースデータ構造203は、仮想関数表205へのポインタを含む。仮想関数表205の各エントリは、IBasicインタフェースのメソッドに対するポインタを含む。IDatabase インタフェース構造204は、仮想関数表206に対するポインタを含む。仮想関数表207の各エントリは、IBasicインタフェースのメソッドのポインタを含む。IBasicインタフェースおよびIDatabase インタフェースは、IUnknownインタフェースを継承し、仮想関数表205および206は、メソッドQueryInterface、AddRefおよびRelease を各々含む。下記において、オブジェクトデータ構造は、オブジェクトがアクセスできるインタフェースでラベル付けした形式222によって表わされる。
【0017】
下記の擬似コードでは、ワードプロセッシングプログラムが、スプレッドシートオブジェクトがIDatabase インタフェースを支援するかどうかを定義する方法を示す。
if(pIBasic->QueryInterface(“IDatabse" , & pIDatabase))
\*IDatabase Supported
else
\*IDatabase not Supported
ポインタ pIBasicは、オブジェクトのIBasicインタフェースに対するポインタである。このオブジェクトがIDatabase インタフェースを支援する場合は、メソッドQueryInterfaceはポインタpIDatabaseをセットし、IDatabase データ構造にポイントして、その値通り真に戻る。
通常、オブジェクトを変数宜言または「新たな」オペレータによって具体化することができる(メモリ内に作成したオブジェクトのインスタンス)。ただし、どちらの実現化技術でも、実行時にワードプロセッシングプログラムにスプレッドオブジェクトを実現化させる必要がある。広域関数CreateInstanceXXを供給する技術もあり、下記のように定義される。
【0018】
static void CreateInstanceXX(REFIID iid, void**ppv) = 0 ;
メソッドCreateInstanceXXは、クラスXXのオブジェクトを実現化し、ポインタppv をパラメータiid によって定義したオブジェクトのインタフェースに戻す。
【0019】
【発明が解決しようとする課題】
上述のように、従来の技術では、ソフトウェアの開発者らが所望のコードを共用する際にその手続きが複雑になるという欠点があった。
したがって、本発明の目的は、オブジェクトを集合させるための方法とそのシステムを提供することにある。
本発明の別の目的は、オブジェクトを別のオブジェクト内に囲む一方、囲まれたオブジェクトのインタフェースを、囲んでいるオブジェクトのクライアントに提示する方法とそのシステムを提供することにある。
また、本発明の別の目的は、別のオブジェクト内に囲むことができるか、オブジェクトの実装を修正せずには別のオブジェクト内に囲むことができないオブジェクトを実現するための方法およびシステムを提供することにある。
さらに、本発明の別の目的は、集合オブジェクトを実現し、クライアントがオブジェクトが集合体であることを意識させないための方法およびシステムを提供することにある。
本発明のもっと別な目的は、オブジェクトを囲むことによって、囲まれたオブジェクト自体が、任意のレベルの囲いに対して囲いをするオブジェクトと成りうる方法およびシステムを提供することにある。
【0020】
上記の目的を含めた他の目的は、本発明の以下の記載で明らかなように、コンピュータシステム内でオブジェクトを集合させる方法およびシステムによって提供される。本発明の方法は、囲まれたオブジェクトを、囲んでいるオブジェクト内に集合させることが好ましい。この囲まれたオブジェクトは、オブジェクト管理インタフェースと1以上の外部インタフェースを有し、これを囲むオブジェクトが制御オブジェクト管理インタフェースを有する。集合オブジェクトによってクライアントに提示した各インタフェースは、質問メンバ関数を有しインタフェースの識別子を受取って、識別済のインタフェースに参照を戻す。囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数は、囲んでいるオブジェクトによって提示されたインタフェースの識別子を受取り、提示したインタフェースに参照を戻す。本発明の好ましい方法では、囲まれたオブジェクトのインスタンスを作成する。囲まれたオブジェクトの提示したインタフェースの質問メンバ関数は、インタフェースの識別子を受取り、受け取った識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、さらに、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済インタフェースの参照として戻す。
【0021】
本発明では、囲まれたオブジェクトの質問メンバ関数は、囲まれたオブジェクトの外部インタフェースの知識を用いて実現され、囲んでいるオブジェクトまたは他の囲まれたオブジェクトの(制御オブジェクト管理インタフェース以外の)インタフェースの知識を有さないのが好ましい。
【0022】
【課題を解決するための手段】
上記目的を達成するために、本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトは、オブジェクト管理インタフェースおよび外部インタフェースを有し、囲んでいるオブジェクトは、制御オブジェクト管理インタフェースを有し、各インタフェースは、インタフェースの識別子を受け取るための質問メンバ関数と識別済のインタフェースに参照を戻すことによって、コンピュータシステム内で、前記囲まれるオブジェクトを前記囲んでいるオブジェクト内に集合させるためのオブジェクト集合方法において、囲んでいるオブジェクトのインタフェースを作成することによって、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースの識別子を受取り、外部インタフェースへ参照を戻すステップと、囲まれたオブジェクトのインスタンスを作成して、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、該受け取られた識別子を渡す囲んでいるオブジェクトの制御オブジェクト管理インタフェースのメンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの呼び出された質問メンバ関数によって戻される参照を識別済のインタフェースに対する参照として戻すステップと、を有することを特徴とする。
【0023】
このため、本発明のオブジェクト集合方法およびシステムは、前記オブジェクトが集合オブジェクトであることを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記集合オブジェクトが集合可能なオブジェクトでないことを特徴とする。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該囲まれたオブジェクトの外部インタフェースに関し、特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトの外部インタフェースに関する特定知識を有さない。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースの質問メンバ関数を呼び出して、該囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステムは、前記囲んでいるオブジェクトが囲まれているオブジェクトの外部インタフェースを格納して、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が該格納された参照を囲まれたオブジェクトの外部インタフェースとして戻す。
【0024】
本発明のオブジェクトの集合方法およびシステムは、クラスはオブジェクト管理インタフェースおよび外部インタフェースを有し、該オブジェクト管理インタフェースと外部インタフェースは各インタフェースにアクセスするための質問メンバ関数を有し、集合オブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクト集合方法およびシステムにおいて、作成インスタンスメンバ関数を生成しクラスのオブジェクトを具体化し、作成インスタンスメンバ関数がオブジェクトを集合させない場合にはクラスのデータメンバ中にクラスのオブジェクト管理インタフェースに対する参照を格納し、データを集合させる場合にはクラスのデータメンバ中に囲んでいるオブジェクトの制御オブジェクト管理インタフェースに対する参照を格納するステップと、オブジェクト管理インタフェースの質問メンバ関数を生成することによって、質問メンバ関数がインタフェースの識別子を受取り、識別されたインタフェースに対して参照を戻すステップと、外部インタフェースの質問メンバ関数を生成して、質問メンバ関数がインタフェースの識別子を受取り、該インタフェースの識別子を渡すデータメンバによって参照を付せられたオブジェクト管理インタフェースを呼び出し、該呼び出された質問メンバ関数によって戻される参照を戻すステップと、を有する。
【0025】
本発明のオブジェクト集合方法およびシステムは、クラスのオブジェクトを実現化するためのグローバル作成インスタンス関数を生成し、グローバル作成インスタンス関数が作成インスタンスメンバ関数を呼び出しクラスのインスタンスを作成し、かつ、オブジェクト管理インタフェースから質問メンバ関数を呼び出しクラスの外部インタフェースに対する参照を検索することによって、グローバル作成インスタンス関数をクライアントによって呼び出し、クライアントがクラスに対するクラス定義にアクセスする必要なく、クラスのインスタンスを作成するステップを有する。
本発明のオブジェクトの集合方法およびシステムは、集合オブジェクトを作成し、集合オブジェクトは囲まれたオブジェクトを有し、囲まれたオブジェクトは集合体によって提示される外部インタフェースを有するオブジェクト集合方法およびシステムにおいて、集合オブジェクトを具体化し、集合オブジェクトが質問メンバ関数を有して、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトを具体化し、囲まれたオブジェクトが外部インタフェースの質問メンバ関数を有し、集合オブジェクトによって指示されたインタフェースに対する参照を検索するステップと、囲まれたオブジェクトに対する参照を格納し、集合オブジェクトの質問メンバ関数は囲まれたオブジェクトに対して格納した参照を使用し、提示された外部インタフェースに対する参照を検索するステップと、集合オブジェクトに対する参照を格納し、外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップと、を有する。
【0026】
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が、質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照されたオブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照は、囲まれたオブジェクトの外部インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数は、外部インタフェースに対する参照を提示された外部インタフェースに対する参照として使用するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースの質問メンバ関数は集合オブジェクトに対して格納した参照を使用し、集合オブジェクトの質問メンバ関数を呼び出し、集合オブジェクトによって提示されたインタフェースに対する参照を検索するステップを有する。
本発明のオブジェクト集合方法およびシステムは、前記囲まれたオブジェクトに対して格納した参照が質問メンバ関数を有する囲まれたオブジェクトのオブジェクト管理インタフェースに対する参照であり、集合オブジェクトの質問メンバ関数が参照オブジェクト管理インタフェースの質問メンバ関数を呼び出し、提示された外部インタフェースに対する参照を検索する。
【0027】
本発明のオブジェクト集合方法およびシステムは、前記外部インタフェースが加算参照を供給し、参照計数メンバ関数を解放し、集合オブジェクトが加算参照を供給し参照計数関数を解放し、囲まれたオブジェクトの外部インタフェースの参照計数メンバ関数が集合オブジェクトの参照計数メンバ関数を呼び出すステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲んでいるオブジェクト内に囲まれたオブジェクトに対する参照を格納するステップとを有し、囲んでいるオブジェクトの質問メンバ関数を実行する場合に、囲まれたオブジェクトの質問メンバ関数を呼び出し、囲まれたオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示された外部インタフェースに対する参照を検索する。
【0028】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に囲まれたオブジェクトを囲み、囲んでいるオブジェクトが質問メンバ関数を有し、囲まれたオブジェクトは質問メンバ関数を有し、それぞれの質問メンバ関数が、囲んでいるオブジェクトによって提示されたインタフェースに対する参照を検索し、囲まれたオブジェクトは囲んでいるオブジェクトによって提示された外部インタフェースを有するオブジェクトの集合方法およびシステムにおいて、囲んでいるオブジェクトを具体化するステップと、囲まれたオブジェクトを具体化するステップと、囲まれたオブジェクト内に囲んでいるオブジェクトに対する参照を格納するステップとを有し、囲まれたオブジェクトの質問メンバ関数を実行する場合に、囲んでいるオブジェクトの質問メンバ関数を呼び出し、囲んでいるオブジェクトに対して格納した参照を利用して囲まれたオブジェクトの提示されたインタフェースに対する参照を検索する。
【0029】
本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクトに対して提示されたインタフェースに対する複数の参照を反映する囲んでいるオブジェクト内に参照カウントを維持するステップを有する。
本発明のオブジェクト集合方法およびシステムは、囲まれたオブジェクトの質問メンバ関数を囲まれたオブジェクトの外部インタフェースに対応させ、囲まれたオブジェクトが質問メンバ関数を備えたオブジェクト管理インタフェースを有し、囲んでいるオブジェクトの質問メンバ関数が囲まれたオブジェクトのオブジェクト管理インタフェースに質問メンバ関数を呼び出し、囲まれたオブジェクトの外部インタフェースに対する参照を検索する。
本発明のオブジェクト集合方法およびシステム集合オブジェクトが囲まれるオブジェクトと囲んでいるオブジェクトを有し、囲んでいるオブジェクトが参照カウントと加算参照メンバ関数と解放メンバ関数とを有し、囲まれたオブジェクトが加算参照メンバ関数と解放参照メンバ関数とを有し、集合オブジェクトに対して参照の計数を行なうオブジェクト集合方法およびシステムにおいて、囲まれたオブジェクトの加算参照メンバ関数の制御下で、囲んでいるオブジェクトの加算メンバ関数を呼び出し、囲んでいるオブジェクトの加算参照メンバ関数が参照カウントをインクリメントするステップと、囲まれたオブジェクトの解放参照メンバ関数の制御下で、囲いでいるオブジェクトの解放参照メンバ関数を呼び出し、囲んでいるオブジェクトの解放参照メンバ関数が参照カウントをディクリメントするステップと、を有する。
【0030】
本発明のオブジェクト集合方法およびシステムは、参照カウントが集合オブジェクトに対する参照が存在しないことを示した場合、囲んでいるオブジェクトと囲まれたオブジェクトを削除する。
本発明のオブジェクト集合方法およびシステムは、クラスがオブジェクト管理インタフェースと外部インタフェースとを有し、オブジェクト管理インタフェースと外部インタフェースがそれぞれ質問メンバ関数を有して、集合可能なオブジェクトのインタフェースにアクセスし、集合可能なオブジェクトを定義するクラスを実現するコンピュータシステムに関するオブジェクトの集合方法およびシステムにおいて、外部インタフェースを定義するステップと、集合可能なクラスを定義し、集合可能なクラスが定義された外部インタフェースを基本クラスとして継承し、集合クラスが定義された外部インタフェースの質問メンバ関数の実装を有し、オブジェクトを集合させていない場合には、定義された外部インタフェースの質問メンバ関数がオブジェクト管理インタフェースを呼び出し、集合可能なオブジェクトを集合させている場合には、集合しているオブジェクトの質問メンバ関数を呼び出すことを特徴とするステップと、を有する。
【0031】
本発明のオブジェクトの集合方法およびシステムは、コンピュータシステムの集合オブジェクトが、オブジェクトのインタフェースの識別子を受取り、インタフェースに対して参照を戻すための質問メンバ関数を有するオブジェクト管理インタフェースと、インタフェースの識別子を受取り、オブジェクトを集合させていない場合にはオブジェクト管理インタフェースの質問メンバ関数が呼び出し、オブジェクトを集合させている場合には、囲んでいるオブジェクトの質問メンバ関数を呼び出し、識別されたインタフェースに対する参照を戻すための質問メンバ関数を有する外部インタフェースと、を含む。
【0032】
【実施例】
本発明は、コンピュータシステムにおいてオブジェクトを集合させる方法を提供する。態様としては、集合オブジェクトがそのクライアントに複数のインタフェースを供給することが好ましい。オブジェクトを具体化するコンピュータプログラムをクライアントと呼ぶ。集合オブジェクトは、1つ以上の囲まれたオブジェクトとIUnknownインタフェースの実装とからなり、この実装を集合オブジェクトの制御IUnknownインタフェースと呼ぶ。集合オブジェクトは、そのクライアントにそれ自体のインタフェースと囲まれたオブジェクトからのインタフェースを提示する。制御IUnknownインタフェースのメソッドQueryInterfaceはポインタを集合オブジェクトによって提示された各インタフェースに戻す。集合オブジェクトは各囲まれたオブジェクトを具体化する。この具体化は、集合オブジェクトの構成を通じてできるし、囲まれたオブジェクトのインタフェースが必要になるまで延期することもできる。各囲まれたオブジェクトは、制御IUnknownインタフェースに対するポインタを含む。囲まれたオブジェクトの提示したインタフェースのメソッドQueryInterfaceは、IUnknownインタフェースのメソッドQueryInterfaceの呼び出しを実現できることが好ましい。囲まれたオブジェクトを実現した場合、一般に開発者らは囲んでいるオブジェクトがどのインタフェースを提示するかについての知識はない。結果的に、囲まれたオブジェクトのメソッドQueryInterfaceが制御IUnknownインタフェースを呼び出して、要求したインタフェースのポインタを検索する。制御IUnknownインタフェースのメソッドQueryInterfaceは、一般に提示したすべてのインタフェースの知識をもって実現される。オブジェクトが囲まれていない場合、制御IUnknownインタフェースは、そのオブジェクトのIUnknownインタフェースであり。逆に、オブジェクトが囲まれている場合は、制御IUnknownインタフェースは囲んでいるオブジェクトのIUnknownインタフェースである。
【0033】
本発明では、集合オブジェクトが参照カウントを維持することが好ましい。集合オブジェクトを具体化した場合、その参照カウントは1にセットされる。制御IUnknownのメソッドQueryInterfaceは、参照がクライアントに戻されると、参照カウントをインクリメントする。囲まれたオブジェクトの提示されたインタフェースのメソッドAddRefは、制御IUnknownインタフェースのメソッドAddRefを呼び出し、集合オブジェクトの参照カウントをインクリメントする。同様に囲まれたオブジェクトの提示されたインタフェースのメソッドRelease は、制御IUnknownインタフェースのRelease を呼び出し、集合オブジェクトの参照カウントをディクリメントし、参照カウントが0ならば集合オブジェクトを削除する。囲まれたオブジェクトを具体化した場合、囲まれたオブジェクトの参照カウントはにセットされる。集合オブジェクトが削除された場合、各囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、囲まれたオブジェクトを消去する。
本発明によるオブジェクト集合方法およびシステムは、中央演算処理装置(CPU)、メモリおよび入出力装置を含むコンピュータで実行されることが好ましい。
【0034】
図3は、集合オブジェクトを示すブロック図である。集合オブジェクトS3はインタフェースA、B、CおよびFならびに制御IUnknownを提示する。(囲んでいる)集合オブジェクトS3は、囲まれたオブジェクトS1・303、囲まれたオブジェクトS2・302、実装I3・304とを含む。囲まれたオブジェクトS1は外部インタフェースCおよびDを実現し、囲まれたオブジェクトS2は外部インタフェースEおよびFを実現する。(外部インタフェースは、囲んでいるオブジェクトによって提示できるオブジェクトのインタフェースである。内部インタフェースは囲んでいるオブジェクトによっては提示できないオブジェクトのインタフェースである。)実装I3は外部インタフェースAおよびBと、制御IUnknownを実現する。集合オブジェクトS3のクライアントは、オブジェクトが集合体であることを意識する必要はない。集合オブジェクトS3は、オブジェクトS1およびS2を集合オブジェクトS3の構成中またはそれより遅い時間に具体化する。実装S3は、オブジェクトS1およびS2のIUnknownインタフェースに対するポインタを含む。オブジェクトS1およびS2は、初期化されて制御IUnknownインタフェースに対するポインタを含む。
【0035】
提示されたインタフェースのメソッドQueryInterfaceは、ポインタを提示された各インタフェースに戻し、ポインタが戻されたときに集合オブジェクトの参照カウントをインクリメントすることができる。制御 IUnknown のメソッド QueryInterface は、実装I3が実装するインターフェース -- , B、及び、制御 IUnknown-- へのポインタへの直接アクセスを持ち、囲まれたオブジェクトの IUnknown インターフェースのメソッド QueryInterface を呼び出して、囲まれたオブジェクトS1及びS2の提示されたインターフェース -- C及びF -- へのポインタを検索する。囲まれたインタフェースに対するポインタを戻すと、制御IUnknownインタフェースのメソッドQueryInterfaceは、制御IUnknownインタフェースのメソッドAddRefを呼び出すことによって、集合オブジェクトS3の参照カウントをインクリメントする。(制御IUnknownインタフェース以外の)各提示されたインタフェースのQueryInterfaceは、制御IUnknownインタフェースのメソッドQueryInterfaceを呼び出すことが好ましい。
【0036】
コード表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;

【0037】
コード表3オブジェクトS1のC++クラス定義を含み、オブジェクトのインスタンスを作成するグローバル関数を加えて集合体(集合オブジェクト)を囲むことができる。IUnknown、ICおよびIDは、各インタフェースのメソッドを定義するインタフェースである。クラスS1は、IUnknownインタフェース、ICインタフェースおよびIDインタフェースを実現する。クラスS1は、ICインタフェースおよびIDインタフェースを外部インタフェースとして実現する。図4は、クラスS1のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。
インスタンス構造401はクラスS1のデータメンバ( m C 、 m D 、 m punkOuter 、 m refcount)とポインタ、ここでは仮想関数表ポインタ(S1::vfptr)を含む。データメンバ m C および m D は、それぞれクラスCおよびDのオブジェクトのインスタンスである。クラスCおよびクラスDはクラスS1を支援し、オブジェクトCおよびDはクラスS1の私的メンバにアクセスすることができる。仮想関数表ポインタS1::vfptr は、仮想関数表402をポイントし、データメンバ内の仮想関数ポインタ m C S1::C::vfptrは仮想関数表403をポイントし、さらにデータメンバ内の仮想関数表ポインタ m D S1::D::vfptrは、仮想関数表403Aをポイントする。仮想関数表402は、IUnknownインタフェース用に定義した仮想関数に対するポインタを含み、仮想関数表403は、Cインタフェース用に定義した仮想関数に対するポインタを含み、仮想関数表403AをインタフェースD用に定義した仮想関数に対するポインタを含む。仮想関数表403および403A内の省略部分はクラスCおよびDの付加的な関数に対するポインタをそれぞれ示している。関数404乃至408は、クラスS1のメンバ関数である。関数407は、クラスS1の構成子である。関数408は、クラスS1の関数CreateInstanceである。関数409乃至412は、クラスCのメンバ関数である。関数412は、クラスCの構成子である。関数413乃至416は、クラスDのメンバ関数である。関数416は、クラスDの構成子である。
【0038】
コード表3に示したように、メソッドS1::QueryInterfaceはインタフェースC、インタフェースDまたはインタフェースIUnknownに対するポインタを戻し、メソッドS1::AddRefを呼び出し、オブジェクトS1の参照カウントをインクリメントする。メソッドS1::AddRefは参照カウントをインクリメントして、メソッドS1::Release は参照カウントをディクリメントし、参照カウントが0になった場合はオブジェクトS1を削除する。
グローバル関数CreateInstanceS1は、クラスオブジェクトS1のインスタンスを作成する。クライアントがこの関数を呼び出し、クラスオブジェクトS1を具体化する。このため、クライアントは、コンパイル時間または実行時にクラスS1の定義にアクセスせずに、クラスS1のオブジェクトを具体化できる。具体化したオブジェクトS1が集合オブジェクトおよびインタフェースの識別子iid 内に囲まれて戻る場合、関数CreateInstanceS1は、制御IUnknown(punkOuter)に対するポインタに渡される。関数CreateInstanceS1は、識別されたインタフェースに対するポインタ(ppv)を戻す。関数CreateInstanceS1は、パラメータpunkOuter を渡しながら、メソッドS1::CreateInstanceを呼び出す。メソッドS1::CreateInstanceは、オブジェクトS1を具体化し、オブジェクトS1のIUnknownインタフェースに対するポインタ(punk) を戻す。関数CreateInstanceS1は、オブジェクトS1のメソッドQueryInterfaceを呼び出し、識別されたインタフェースに対するポインタを検索する。関数CreateInstanceS1は、オブジェクトS1のメソッドRelease を呼び出すが、これは、一時ポインタpunkが必要となくなったからである。
メソッドS1::CreateInstanceはオブジェクトS1を具体化し、オブジェクトS1のIUnknownインタフェースに対するポインタ(ppunk)を戻す。メソッドS1::CreateInstanceは、制御IUnknownに対するポインタ(punkOuter)に渡される。メソッドS1::CreateInstanceは新たにオペレータを使用して、オブジェクトS1を具体化する。具体化している間に、構成子S1::S1を呼び出し、パラメータpunkOuter の値に渡す。オブジェクトS1が構成された後、メソッドCreateInstanceは、メソッドS1::QueryInterfaceを呼び出し、オブジェクトS1のIUnknownインタフェースに対するポインタを検索する。
【0039】
構成子S1::S1は、データメンバ m C 、 m D 、 m punkOuter および m refcountを初期化する。構成子S1::S1は、パラメータpunkOuter に渡される。データメンバ m C および m D の具体化中、構成子C::CおよびD::Dを呼び出し、オブジェクトS1に対するポインタthisに渡す。パラメータpunkOuter の値がNULLであれば、構成子S1::S1はデータメンバ m punkOuter をポインタthisの値にセットする(このポインタは、新たに具体化したオブジェクトS1をポイントする)。パラメータpunkOuter の値がNULLでなければ、構成子S1::S1は、データメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトS1が囲まれている場合には、集合体の制御IUnknownの値をポイントし、オブジェクトS1が囲まれていない場合には、オブジェクトS1の制御IUnknownをポイントする。構成子S1::S1は、データメンバ m fercountをゼロに初期化もする。
構成子C::Cは、オブジェクトS1に対するポインタに渡される。構成子C1::C1は、渡されたポインタをC::m pS1 内に格納する。データメンバC::m pS1 は、クラスCのメソッドによって使用され、データメンバS1:: m punkOuter にアクセスする。
【0040】
メソッドC::QueryInterface 、C::AddRef およびC::Releaseは、データメンバS1:: m punkOuter によってポイントされるIUnknownインタフェースの中で対応するメソッドを呼び出し、これによってオブジェクトS1が囲まれている場合には、集合体の制御IUnknownInterface にポイントする。
クラスDの構成子およびその他のメソッドはクラスCの構成子およびその他のメソッドに類似している。
図4は、集合体の部分以外のオブジェクトS1のインスタンスである。データメンバS1::C::m pS1 、S1::D::m pS1 および S1::m punkOuter は、オブジェクトS1自体に対するポインタに初期化される。データメンバ m C およびm D のメソッドQueryInterface、AddRefおよびRelease は、オブジェクトS1のインタフェースのIUnknownメソッドを呼び出す。
インタフェースEおよびFを実現するオブジェクトS2は、上述のオブジェクトS2と類似している。
【0041】
コード表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;
};
【0042】
コード表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はこれらのインタフェースを提示しない。
【0043】
メソッドS3::QueryInterface、S3::AddRefおよびS3::Release は、集合体の制御IUnknownインタフェースを構成する。メソッドS3::QueryInterfaceは、制御IUnknownインタフェースA、B、CまたはFに対するポインタを戻し、オブジェクトS3に対する参照カウントをインクリメントする。メソッドS3::AddRefは、参照カウントをインクリメントし、メソッドS3::Release は参照カウントをディクリメントし参照カウントが0になるとオブジェクトS3を削除する。
グローバル関数CreateInstanceS3は、クラスS3のオブジェクトのインスタンスを作成する。クライアントは、この関数を呼び出して、クラス3のオブジェクトを具体化する。このため、クライアントは、コンパイル時および実行時においてクラスS3の定義にアクセスせずにクラスS3のオブジェクトを具体化することができる。具体化されたオブジェクトS3が集合オブジェクトおよびクラスS3によって提示されたインタフェースの識別子(iid)に囲まれて戻る場合に、関数CreateInstanceS3は、制御IUnknownインタフェース(punkOuter)に対するポインタに渡される。関数CreateInstanceS3は識別されたインタフェースに対するポインタ(ppv) を戻す。関数CreateInstanceS3は、パラメータpunkOuter を渡しながら、メソッドS3::CreateInstanceを呼び出す。メソッドS3::CreateInstanceは、オブジェクトS3を具体化し、オブジェクトS3のIUnknownインタフェースに対するポインタ(punk)を戻す。関数CreateInstanceS3は、メソッドS3::QueryInterfaceを呼び出し、識別されたインタフェースに対するポインタを検索する。
一時ポインタpunkは不要になるので、関数CreateInstanceS3はメソッドS3::Release を呼び出す。
【0044】
メソッドS3::CreateInstanceは、オブジェクトS3を具体化し、オブジェクトS3のIUnknownに対するポインタ(ppunk)を戻す。メソッドS3::CreateInstanceは、制御IUnknownに対するポインタ(punkOuter)に渡される。メソッドS3::CreateInstanceは、新たにオペレータを使用してオブジェクトS3を具体化する。具体化を通じて、構成子S3::S3を呼び出し、パラメータpunkOuter に渡す。オブジェクトS3が構成された後、メソッドS3::CreateInstanceは関数CreateInstanceS1を呼び出して囲まれたオブジェクトS1を作成する。メソッドS3::S3CreateInstanceはパラメータ m p01->punkOuterおよびIUnknownインタフェース対応のインタフェース識別子を渡して、オブジェクトS1のIUnknownインタフェースに対するポインタに戻される。メソッドS3::CreateInstanceは、データメンバS3:: m punkS1内に戻されたポインタを格納する。メソッドS3::CreateInstanceは、関数CreateInstanceS2を呼び出し、オブジェクトS1の作成と同様の方法でオブジェクトS2を作成する。メソッドS3::CreateInstanceは、パラメータiid によって識別されたインタフェースに対するポインタを検索する。
メソッドS3::AddRefは、オブジェクトS3の参照カウントをインクリメントする。メソッドS3::Release は、参照カウントをディクリメントする。参照カウントが0になると、メソッドS3::Release は、オブジェクトS3を削除する。
【0045】
構成子S3::S3は、データメンバ m A 、 m B 、 m punkouter および m refcountを初期化する。構成子S3::S3は、パラメータpunkOuter に渡される。データメンバ m A および m B の具体化を通じ、構成子 A::A および B::B を呼び出して、オブジェクトS3対応のポインタthisに渡す。パラメータpunkOuter の値がNULLであれば、構成子S3::S3は、(新たに具体化したオブジェクトS3をポイントする)ポインタthisの値にデータメンバ m punkOuter をセットする。パラメータpunkOuter の値がNULLでない場合には、構成子S3::S3はデータメンバ m punkOuter をパラメータpunkOuter の値にセットする。データメンバ m punkOuter は、オブジェクトS3が囲まれている場合には、集合体の制御IUnknownインタフェースの値をポイントし、オブジェクトS3が囲まれていない場合にはオブジェクトS3のIUnknownインタフェースをポイントする。構成子S3::S3は、データメンバ m refcountを0に初期化する。
消去関数S3::-S3 は、メソッドS1::Release を呼び出して、囲まれたオブジェクトS1の参照カウントをディクリメントする。オブジェクトS1の具体化を通じ、参照カウントはすでに1にセットされているので、メソッドS1::Release はオブジェクトS1を削除する。消去関数S3::-S3 は、同様の方法でオブジェクトS2の参照カウントをディクリメントする。
【0046】
インタフェースAおよびBは、インタフェースCのメソッドに同様の動作をする。こうしてインタフェースAおよびBは、オブジェクトS3が囲まれた場合に提示できる。
図5は、オブジェクトS3のデータ構造レイアウトを示すブロック図である。
このデータ構造レイアウトは、インスタンスデータ501、仮想関数表502、503および504、メソッド505乃至517、オブジェクトS1・401乃至413およびオブジェクトS2・519とを含む。インスタンスデータ501は、制御IUnknownインタフェースとクラスAおよびBのインスタンスであるデータメンバ m A および m B と、オブジェクトS3のIUnknownインタフェースをポイントするデータメンバ m punkOuter と、オブジェクトS3対応の参照カウントを含むデータメンバ m refcountと囲まれたオブジェクトS1のIUnknownをポイントするデータメンバ m punkS1と、囲まれたオブジェクトS2・515のIUnknownインタフェースをポイントするデータメンバ m punkS2とに対応した仮想関数表に対するポインタを含む。囲まれたオブジェクトS1が具体化されると、そのデータメンバ S1::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースをポイントする。同様に囲まれたオブジェクトS2が具体化されると、そのデータメンバ S2::m punkOuter は初期化され、オブジェクトS3のIUnknownインタフェースをポイントする。
【0047】
図6および図7は、囲んでいるオブジェクトと囲まれたオブジェクトとの共同動作を示すブロック図である。図6は、別のオブジェクトに囲まれていないクラスS1のオブジェクトを示すブロック図である。クラスS1のオブジェクト601には、データメンバ m punkOuter を含み、これはIUnknownインタフェースおよびメソッド603、604、605および606をポイントする。メソッドIUnknown::QueryInterface603は、要求されたインタフェースに対するポインタを戻し、参照カウントをインクリメントする。メソッド C::QueryInterface605および C::AddRef606は、IUnknownインタフェースの対応するメソッドを呼び出す。(図に示さない)クラスDのメソッドの実装は、クラスCのものと同様である。図7は、クラスS1およびS2のオブジェクトを囲むクラスS3のオブジェクトを示す図である。オブジェクトS2は、オブジェクトS1と同様であるが図に示していない。クラスS1のオブジェクト601のデータメンバ関数 m punkOuter 602は、クラスS3のオブジェクト610のIUnknownインタフェースをポイントする。メソッドIUnknown::QueryInterface613は、提示された各オブジェクトに対するポインタを戻し、データメンバ m punkS1・619によってポイントされるメソッドIUnknown::QueryInterface603を呼び出し、インタフェースCに対するポインタを検索する。クラスAおよびBのメソッドQueryInterface615および617は、データメンバ m punkOuter 612によって示されるメソッドを呼び出す。
【0048】
上述の本発明の実施例において、集合体の制御IUnknownインタフェースのメソッドQueryInterfaceは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、提示されたインタフェースに対するポインタを検索する。本発明の別の実施例においては、囲んでいるオブジェクトが提示する囲まれたオブジェクトのインタフェースに対するポインタを、囲んでいるオブジェクトを変換することができる。このため、制御IUnknownのメソッドQueryInterfaceが呼び出されると、このメソッドは、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出すというよりは、変換されたポインタを検索して戻すことができる。この別の実施例を実現するためは、囲んでいるオブジェクトによって、各変換されたポインタに対応したデータメンバを定義する。(一般に囲んでいるオブジェクトの構成中に)囲まれたオブジェクトが具体化された場合、囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出して提示されたインタフェースのポインタを検索する。検索されたポインタが参照カウントされず、囲んでいるオブジェクトが囲まれたオブジェクトに対して1つのポインタのみを効果的に維持することが好ましい(S3:: m punkS1など)。囲まれたオブジェクトは、メソッドRelease に対して1回のコールだけで削除することができる。したがって、ポインタを変換した後、囲まれたオブジェクトのIUnknownインタフェースのメソッドRelease が呼び出され、変換されたポインタに属する参照カウントを除去する。
【0049】
上述の本発明の実施例において、制御IUnknownインタフェースのメソッドQueryInterfaceの実装は、どのインタフェースが提示されるかを指定するswitch文を含む。例えば、メソッドS3::QueryInterfaceのswitch文は、提示された各インタフェースA、B、CおよびFと制御IUnknownに対するcaseラベルを含む。このため、提示されたインタフェースは囲んでいるオブジェクトの実現中に静的に定義される。別の実施例においては、制御IUnknownインタフェースメソッドQueryInterfaceを囲まれたオブジェクトの外部インタフェースに関する知識を特に必要としなくても実現できる。実現しないインタフェースに対するポインタを要求したとき、メソッドQueryInterfaceは囲まれたオブジェクトのIUnknownインタフェースのメソッドQueryInterfaceを呼び出し、囲まれたオブジェクトによって実現されていれば、識別されたインタフェースに対するポインタを検索する。コード表5は、オブジェクトS3に対する制御IUnknownインタフェースのメソッドQueryInterfaceのC++実装であり、本発明の別の1実施例である。かこまれたオブジェクトの外部インタフェースに対するポインタを戻すことに加えて、制御IUnknownのメソッドQueryInterfaceは、他のすべての外部インタフェースを提示する一方で、特定の外部インタフェースを提示せずに実現することができよう。
【0050】
コード表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が障害を示すフラッグを戻すなど)。
【0051】
上述の実施例では、集合オブジェクト自体が、囲んでいるオブジェクト内に囲まれたオブジェクトとなりうる。この囲い込み(ネスティング)は深さを問わず起こりうる。また、集合オブジェクトが集合不可能にすることもできる。クラスXXに対応する関数CreateInstanceXXは、パラメータpunkOuter がヌルでない場合、すなわち、集合が所望される場合に障害を示すフラグを戻すことができる。
上述の実施例では、集合オブジェクトの各外部インタフェースに対応するオブジェクトは、集合オブジェクトのデータメンバとして、具体化される。これに代わる実施例では、集合オブジェクトのデータメンバとして実現されるよりむしろ、外部インタフェースが集合オブジェクトによって継承される。コード表6は、外部インタフェースCおよびDを有する集合クラスのC++クラス定義を含む。
クラスS1は、抽象クラスICおよびIDを継承する。インタフェースICおよびIDの実装は導出クラスS1に対するポインタを格納してデータメンバ m punkOuter にアクセスする必要はない。逆に、インタフェースICおよびIDの実装は、コード表3に示すように、導出クラスに対するポインタをデータメンバ m pS1 に格納する。インタフェースを継承する際に、他の実装が可能であると評価する当業者もいることだろう。
【0052】
コード表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 ;

本発明に関しては、好ましい態様を述べてきたが、本発明をその態様のみ限定する意図はない。本発明の精神に則った修正および変更は、当業者らによって明らかなものとなろう。本発明の適用範囲は添付の請求の範囲において定められる。
【0053】
【発明の効果】
以上説明したように、本発明のオブジェクト集合方法およびシステムは、囲んでいるオブジェクト内に、囲まれたオブジェクトを集合させ、囲まれたオブジェクトがオブジェクト管理インタフェースと外部インタフェースとを有し、囲んでいるオブジェクトが制御オブジェクト管理インタフェースを有し、集合したオブジェクトによってクライアントに提示されたインタフェースが、インタフェースの識別子を受取り識別したインタフェースに参照を戻すための質問メンバ関数を有し、囲んでいるオブジェクトのインスタンスを作成し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数が囲んでいるオブジェクトによって提示されたインタフェースの識別子を受け取って提示されたインタフェースに対する参照を戻し、さらに、囲まれたオブジェクトのインスタンスを作成し、囲まれたオブジェクトの外部インタフェースの質問メンバ関数がインタフェースの識別子を受取り、受け取った識別子を渡して囲んでいるオブジェクトの制御オブジェクト管理インタフェースの質問メンバ関数を呼び出し、囲んでいるオブジェクトの制御オブジェクト管理インタフェースの中から呼び出された質問メンバ関数によって戻される参照を識別されたインタフェースの参照として戻すので、複雑な手続きを取らず所望のコードを共用し、プログラム開発時のコストを低減させることができるという効果がある。
【図面の簡単な説明】
【図1】 オブジェクトの表現に使用する一般的なデータ構造を示すブロック図である。
【図2】 スプレッドオブジェクトのサンプルデータ構造を示すブロック図である。
【図3】 本発明による集合オブジェクトを示すブロック図である。
【図4】 本発明によるクラスS1のオブジェクトのインスタンスのデータ構造レイアウトのブロック図である。
【図5】 本発明によるオブジェクトS3のデータ構造レイアウトを示すブロック図である。
【図6】 本発明による別のオブジェクトに囲まれていないクラスS1のオブジェクトを示すブロック図である。
【図7】 本発明によるクラスS1およびS2のオブジェクトを囲むクラスS3のオブジェクトを示す図である。
【符号の説明】
101 インスタンスデータ構造
102、202、205、206、402、403、403A、502、503、504 仮想関数表
103、104、105 メンバ関数
201 オブジェクトデータ構造
203 IBasicインタフェースデータ構造
204 IBasicインタフェースデータ構造
207、208、209、210、211、212、213、214、215、216、217、218、219、220、221 メソッド
222 形式
301 囲んでいるオブジェクトS3
302 囲まれたオブジェクトS2
303 囲まれたオブジェクトS1
304 実装I3
401 インスタンス構造
404、405、406、406、408 関数
409、410、411、412 クラスCのメンバ関数
413、414、415、416 クラスDのメンバ関数
501 インスタンスデータ
505、506、507、508、509、510、511、512、513、514、515、516、517、603、604、605、606、613、615、617 メソッド
519 オブジェクトS2
601 クラスS1のオブジェクト
602 データメンバ関数
610 クラスS3のオブジェクト
612 データメンバ
619 データメンバ

Claims (9)

  1. CPU及びメモリを有するコンピュータシステムにおける、CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトのために参照の計数を行う方法であって、囲んでいるオブジェクト及び囲まれたオブジェクトが集合オブジェクト内に集合され、囲んでいるオブジェクト及び囲まれたオブジェクトのそれぞれが参照カウントを有し、
    囲まれたオブジェクトが、制御オブジェクトマネジメントインターフェースの実装(implementation)へのポインタを有し、囲んでいるオブジェクトが、オブジェクトマネジメントインターフェースの実装へのポインタを有し、各マネジメントインターフェースが、囲んでいる又は囲まれたオブジェクトのいずれかが、識別されたインターフェースを実装する(implement)場合に指示を戻すために、そして、そのような場合に、ポインタを当該インターフェースの実装に戻すために、インターフェースの識別子を受け取るための質問メンバ関数を有し、
    各マネジメントインターフェースが、加算参照メンバ関数と開放参照メンバ関数とを有し、
    当該加算参照メンバ関数と開放参照メンバ関数がそれぞれ、加算参照メンバ関数及び開放参照メンバ関数が実装されるオブジェクトのための参照カウントを増加及び減少させ、
    囲んでいるオブジェクト及び囲まれているオブジェクトの各々が、オブジェクトによって実装されたインターフェースへのアクセスを持つために、それぞれの他のオブジェクトへの参照を有し、
    当該方法が、
    囲まれたオブジェクトの加算参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの加算参照メンバ関数を呼び出し、囲んでいるオブジェクトの加算参照メンバ関数が、CPUによる実行に基づいて、
    囲んでいるオブジェクトの参照カウントをインクリメントするものであり、そして、
    囲まれたオブジェクトの開放参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの開放参照メンバ関数を呼び出し、囲んでいるオブジェクトの開放参照メンバ関数を呼び出す際に、CPUが囲んでいるオブジェクトの参照カウントをディクリメントするものであり、参照カウントが、囲んでいるオブジェクトへの参照が存在しないことを指示するときに、囲んでいるオブジェクトと囲まれたオブジェクトを削除するためのプログラム命令による制御下で、
    CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトを削除するものであり、CPUが囲んでいるオブジェクト及び囲まれたオブジェクトを削除することによって、CPUが集合オブジェクトを削除することになるものである、
    という段階を含む方法。
  2. CPU及びメモリを有するコンピュータシステムにおける、CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトのために参照をカウントする方法であって、囲んでいるオブジェクト及び囲まれたオブジェクトのそれぞれが参照カウントを有し、
    囲まれたオブジェクトが、制御オブジェクトマネジメントインターフェースの実装(implementation)へのポインタを有し、囲んでいるオブジェクトが、オブジェクトマネジメントインターフェースの実装へのポインタを有し、各マネジメントインターフェースが、囲んでいる又は囲まれたオブジェクトのいずれかが、識別されたインターフェースを実装する(implement)場合に指示を戻すために、そして、そのような場合に、ポインタを当該インターフェースの実装に戻すために、インターフェースの識別子を受け取るための質問メンバ関数を有し、
    各マネジメントインターフェースが、加算参照メンバ関数及び開放参照メンバ関数とを有し、
    当該加算参照メンバ関数と開放参照メンバ関数がそれぞれ、加算参照メンバ関数及び開放参照メンバ関数が実装されるオブジェクトのための参照カウントを増加及び減少させ、
    囲まれたオブジェクトが加算参照メンバ関数を含む外部インターフェースの実装を有し、
    囲んでいるオブジェクト及び囲まれているオブジェクトの各々が、オブジェクトによって実装されたインターフェースへのアクセスを持つために、それぞれの他のオブジェクトへの参照を有し、
    当該方法が、
    囲まれたオブジェクトの外部インターフェースの加算参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの加算参照メンバ関数を呼び出し、CPUが、囲んでいるオブジェクトの加算参照メンバ関数を実行することによって、囲んでいるオブジェクトの参照カウントをインクリメントし、
    囲まれたオブジェクトの開放参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの開放参照メンバ関数を呼び出し、CPUが、囲んでいるオブジェクトの開放参照メンバ関数を実行することによって、囲んでいるオブジェクトの参照カウントをディクリメントするものであり、参照カウントが、囲んでいるオブジェクトへの参照が存在しないことを指示するときに、囲んでいるオブジェクト及び囲まれているオブジェクトを削除するためのプログラム命令の制御下で、CPUが、囲んでいるオブジェクト及び囲まれているオブジェクトを削除するものである、
    という段階を含む方法。
  3. CPUとメモリを有するコンピュータシステムにおける、CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトのために参照をカウントする方法であって、囲んでいるオブジェクト及び囲まれたオブジェクトのそれぞれがが参照カウントを有し、
    囲まれたオブジェクトが、制御オブジェクトマネジメントインターフェースの実装(implementation)へのポインタを有し、囲んでいるオブジェクトが、オブジェクトマネジメントインターフェースの実装へのポインタを有し、各マネジメントインターフェースが、囲んでいる又は囲まれたオブジェクトのいずれかが、識別されたインターフェースを実装する(implement)場合に指示を戻すために、そして、そのような場合に、ポインタを当該インターフェースの実装に戻すために、インターフェースの識別子を受け取るための質問メンバ関数を有し、
    各マネジメントインターフェースが、加算参照メンバ関数及び開放参照メンバ関数とを有し、
    当該加算参照メンバ関数と開放参照メンバ関数がそれぞれ、加算参照メンバ及び開放参照メンバが実装されるオブジェクトのための参照カウントを増加及び減少させ、
    囲まれたオブジェクトが開放参照メンバ関数を含む外部インターフェースの実装を有し、
    囲んでいるオブジェクト及び囲まれているオブジェクトの各々が、オブジェクトによって実装されたインターフェースへのアクセスを持つために、それぞれの他のオブジェクトへの参照を有し、
    当該方法が、
    囲まれたオブジェクトの加算参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの加算参照メンバ関数を呼び出し、CPUが、囲んでいるオブジェクトの加算参照メンバ関数を実行することによって、
    囲んでいるオブジェクトの参照カウントをインクリメントするものであり、そして、
    囲まれたオブジェクトの外部インターフェースの開放参照メンバ関数のプログラム命令による制御下で、CPUが、囲んでいるオブジェクトの開放参照メンバ関数を呼び出し、CPUが、囲んでいるオブジェクトの開放参照メンバ関数を実行することによって、
    囲んでいるオブジェクトの参照カウントをディクリメントするものであり、参照カウントが、囲んでいるオブジェクトへの参照が存在しないことを指示するときに、囲んでいるオブジェクト及び囲まれているオブジェクトを削除するためのプログラム命令の制御下で、CPUが、囲んでいるオブジェクト及び囲まれているオブジェクトを削除するものである
    という段階を含む方法。
  4. CPU及びメモリを有するコンピュータシステムにおける、CPUが、囲んでいるオブジェクト内に集合した囲まれたオブジェクトのために参照をカウントする方法であって、囲んでいるオブジェクト及び囲まれているオブジェクトのそれぞれが、参照カウントを有し、
    囲まれたオブジェクトがオブジェクトマネジメントインターフェース及び外部インターフェースとを有し、囲んでいるオブジェクトが制御オブジェクトマネジメントインターフェースを有し、各マネジメントインターフェースが、囲んでいるオブジェクト又は囲まれたオブジェクトのいずれかが、識別されたインターフェースを実装する場合に指示を戻すための、そして、そのような場合に、ポインタを当該インターフェースの実装に戻すためのインターフェースの識別子を受け取るための、質問メンバ関数を有し、
    各オブジェクトマネジメントインターフェースが、加算参照メンバ関数及び開放参照メンバ関数とを有し、
    当 該加算参照メンバ関数と開放参照メンバ関数がそれぞれ、加算参照メンバ関数及び開放参照メンバ関数が実装されるオブジェクトのための参照カウントを増加及び減少させ、
    囲 んでいるオブジェクト及び囲まれているオブジェクトの各々が、オブジェクトによって実装されたインターフェースへのアクセスを持つために、それぞれの他のオブジェクトへの参照を有し、
    当該方法が、
    CPUが、囲んでいるオブジェクトのインスタンスを生成し、
    CPUが、囲まれたオブジェクトのインスタンスを生成し、
    CPUによる、具体化された(instantiated)囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの質問メンバ関数の実行によって、CPUが、具体化された囲まれたオブジェクトの外部インターフェースの識別子を受け取り、
    CPUが、囲んでいるオブジェクトの参照カウントをインクリメントするために、制御オブジェクトマネジメントインターフェースの加算参照メンバ関数を呼び出し、そして、
    CPUが、外部インターフェースへの参照として、メモリに格納されたポインタを戻し、
    CPUによる、具体化された囲まれたオブジェクトの外部インターフェースの質問メンバ関数の実行によって、CPUが、インターフェースの識別子を受け取り、
    CPUが、具体化された囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの質問メンバ関数を呼び出し、CPUは、受け取った識別子を渡すものであり、そして、
    具体化された囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの呼び出された質問メンバ関数によって戻された参照を、CPUが、識別されたインターフェースへの参照として戻そして、
    CPUが、具体化された囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの開放メンバ関数を実行することによって、
    CPUが、囲んでいるオブジェクトの参照カウントを減少させ、そして、
    参照カウントが、囲んでいるオブジェクト内の囲まれたオブジェクトの集合への参照が存在しないことを指示するときに、CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトを削除する、
    という段階を含む方法。
  5. 請求項4に記載の方法であって、
    CPUによる、具体化された囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの質問メンバ関数の実行によって、CPUが、具体化された囲んでいるオブジェクトの露呈されたインターフェースの識別子を受け取り、
    囲んでいるオブジェクトの参照カウントをインクリメントするために、CPUが、制御オブジェクトマネジメントインターフェースの加算参照メンバ関数を呼び出し、そして、
    CPUが、メモリに格納されたポインタを戻し、当該ポインタは、具体化された囲んでいるオブジェクトの露呈されたインターフェースへの参照としてのものである、
    という段階を更に含む方法。
  6. CPUが、囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの質問メンバ関数を実行することによって、
    具体化された囲まれたオブジェクトのオブジェクトマネジメントインターフェースの質問メンバ関数を呼び出すことによって、メモリに格納されたポインタを検索し、当該ポインタは、具体化された囲まれたオブジェクトの外部インターフェースへの参照としてのものである、
    請求項4に記載の方法。
  7. CPUが、具体化された囲まれたオブジェクトのオブジェクトマネジメントインターフェースの質問メンバ関数を呼び出す段階が、
    CPUが、外部インターフェースの識別子を受け取り、そして、
    CPUが、メモリに格納されたポインタを戻し、当該ポインタは、識別された外部インターフェースへの参照としてのものである、
    CPUが実行するサブ段階を含み、
    そして更に、
    CPUが、参照カウントをインクリメントするために制御オブジェクトマネジメントインターフェースの加算参照メンバ関数を呼び出す段階が、具体化された囲まれたオブジェクトのオブジェクトマネジメントインターフェースの質問メンバ関数の、CPUによる実行中に実行されるものである、
    請求項6に記載の方法。
  8. CPUが、具体化された囲んでいるオブジェクトに、具体化された囲まれたオブジェクトの外部インターフェースへの参照を記憶させ、CPUが、具体化された囲んでいるオブジェクトの制御オブジェクトマネジメントインターフェースの質問メンバ関数を実行することによって、記憶された参照を、具体化された囲まれたオブジェクトの外部インターフェースへの参照として戻す、請求項4に記載の方法。
  9. CPUが、囲んでいるオブジェクト及び囲まれたオブジェクトを削除する段階が、
    CPUが、具体化された囲まれたオブジェクトのオブジェクトマネジメントインターフェースの開放参照メンバ関数を呼び出し、
    CPUによる、具体化された囲まれたオブジェクトのオブジェクトマネジメントインターフェースの開放参照メンバ関数の実行によって、CPUが囲まれたオブジェクトの参照カウントをディクリメントし、そして、
    囲まれたオブジェクトの参照カウントが、具体化された囲まれたオブジェクトへの参照が存在しないことを指示する時に、CPUが、具体化された囲まれたオブジェクトを削除し、そして、
    CPUが、具体化された囲んでいるオブジェクトを削除する、
    CPUが実行するサブ段階を含む、請求項に記載の方法。
JP2002142748A 1992-12-24 2002-05-17 オブジェクト集合方法およびシステム Expired - Lifetime JP4084956B2 (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 Parent Applications (1)

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

Publications (2)

Publication Number Publication Date
JP2003022186A JP2003022186A (ja) 2003-01-24
JP4084956B2 true JP4084956B2 (ja) 2008-04-30

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 Before (1)

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

Country Status (5)

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

Families Citing this family (11)

* 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
JPH08297573A (ja) * 1995-04-27 1996-11-12 Fujitsu Ltd オブジェクトデータ処理装置
EP0841612A3 (en) * 1996-11-08 2003-05-28 International Business Machines Corporation Framework for software development
US6125364A (en) * 1997-11-06 2000-09-26 International Business Machines Corporation Flexible object persistence framework using data cursor objects loaded from superclasses
US6487551B2 (en) 1998-09-24 2002-11-26 International Business Machines Corporation Externalizing very large objects in a relational database client/server environment
US6564368B1 (en) 1998-10-01 2003-05-13 Call Center Technology, Inc. System and method for visual application development without programming
US6397384B1 (en) 1998-12-18 2002-05-28 Adobe Systems Incorporated Run-time addition of interfaces
US6877163B1 (en) * 1999-06-14 2005-04-05 Sun Microsystems, Inc. Method and system for dynamic proxy classes
US8108831B2 (en) * 2008-02-07 2012-01-31 Microsoft Corporation Iterative component binding
JP2009271770A (ja) * 2008-05-08 2009-11-19 Sumitomo Heavy Ind Ltd プログラミング装置

Family Cites Families (1)

* 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

Also Published As

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

Similar Documents

Publication Publication Date Title
JP4322967B2 (ja) オブジェクト集合方法及びシステム
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
US7225426B2 (en) Dynamic objects with property slot definition and runtime mechanisms
US6606742B1 (en) Object-oriented interface for portability to diverse operating systems or hardware platforms
US5455951A (en) Method and apparatus for running an object-oriented program on a host computer with a procedural operating system
US6351778B1 (en) Object-oriented operating system
US5473777A (en) Wrapper for enabling an object otented application to maintain virtual memory using procedural function calls
US5404529A (en) Object-oriented interprocess communication system interface for a procedural operating system
US6968540B2 (en) Software instrumentation method and apparatus
US5896532A (en) Objects with run-time classes and methods of making them
US6085034A (en) Constructor based object initialization with overrides
JP4084956B2 (ja) オブジェクト集合方法およびシステム
EP0846288B1 (en) Portable object-oriented operating system
Hamilton Conference on Object-Oriented Technologies (COOTS) Toronto, Ontario, Canada, June 1996.

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: 20050623

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20050628

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: 20060313

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20060315

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: 20060811

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20070213

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20070216

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070521

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20071203

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20071206

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20071227

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20080218

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: 20110222

Year of fee payment: 3

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

Free format text: PAYMENT UNTIL: 20120222

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20120222

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20130222

Year of fee payment: 5

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

Free format text: PAYMENT UNTIL: 20130222

Year of fee payment: 5

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

Free format text: PAYMENT UNTIL: 20140222

Year of fee payment: 6

EXPY Cancellation because of completion of term