[前へ] [目次へ] [次へ]

オブジェクト


FGESではクラスやメソッドを含め、ほぼ全ての要素がオブジェクトです。

●オブジェクトの作成

   オブジェクトは以下の状況で作成され、対応する寿命が設定されます。
   また、ネイティブメソッド内でもFGESのオブジェクトを作成することが出来、
   その場合の寿命はネイティブメソッドの責任において設定します。
状況寿命
グローバル変数を実体定義した時プロセスの終了まで
クラス共有変数を実体定義した時所属するクラスオブジェクトと同じ
インスタンス変数を実体定義した時所属するオブジェクトと同じ
ローカル変数を実体定義した時定義したローカルスコープの終了まで
#New演算子を実行した時左辺のメモリ管理オブジェクトと同じ
@=LocalNew演算子を実行した時左辺を定義したローカルスコープの終了まで
retvalによって値返しした時呼び出し元の文の終了まで(一時オブジェクト)
定数を記述した時記述した文の終了まで(一時オブジェクト)

●オブジェクトの寿命

   全てのオブジェクトには寿命があり、寿命に達したオブジェクトは消滅します。
   寿命の管理にはメモリ管理オブジェクトと特殊値が使用されます。
   メモリ管理オブジェクトによって寿命を設定されているオブジェクトは
   そのメモリ管理オブジェクトの消滅に連動して消滅します。
   特殊値によって寿命を設定されているオブジェクトの寿命は以下の通りです。
特殊値意味寿命
FGES_MEMCTRL_INVALID管理外オブジェクト寿命が設定されていない。
この状態のオブジェクトにFGES上からアクセスできてはいけない。
FGES_MEMCTRL_EXTERNC++管理オブジェクトC++レベルで管理されているオブジェクト。
FGESメモリ管理外であり、C++レベルでの明示的な解放が必要。
この状態はネイティブメソッドでのみ設定可能。
FGES_MEMCTRL_SLAVE従属解放オブジェクト親オブジェクトと連動して消滅する。
インスタンス変数は通常これに設定される。
FGES_MEMCTRL_RELINK_REQUEST再設定要求寿命変更処理の途中。
この状態のオブジェクトにFGES上からアクセスできてはいけない。
FGES_MEMCTRL_TEMPORARY一時オブジェクト一時的なオブジェクト。
設定された文の終了時に(一時オブジェクト解放命令によって)消滅する。

●イニシャライザ

   オブジェクトが作成された時、暗黙にイニシャライザが呼び出されます。
   作成したオブジェクトのクラスにイニシャライザが定義されていない場合は呼び出されません。
   オブジェクトがインスタンス変数を持つ場合、インスタンス変数のイニシャライザが先に実行されます。
   
   FGESのイニシャライザはC++のコンストラクタに近いものですが、引数を取れないことが異なります。
   また、C++のコンストラクタとコピーコンストラクタのような区別が無く、
   オブジェクト作成時に必ず同じメソッドが呼び出される点も異なります。
   (引数を取れない理由は引数のあるイニシャライザを暗黙的に呼び出せないためです。
    この問題はC++において配列newで引数付きコンストラクタを使えないことと同じものです)
   
   また、ネイティブクラスではC++レベルのイニシャライザとして
   IFGESObject::InitObject をオーバーライドして使用する必要があります。
   ネイティブクラスではFGESレベルのイニシャライザは使用できません。

   イニシャライザはクラス定義時に言語定義メソッド名 #Init として定義します。
   イニシャライザは戻り値型 void で引数を取らないメソッドである必要があります。
   なお、イニシャライザでは戻り値型の記述を省略できます。

   例:
<  1>
<  2>
<  3>
   class C{
      
method #Init(){} //イニシャライザの定義
   } 

   引数付きイニシャライザを擬似的に利用するには、以下のような定義が考えられます。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
   class C{
      
var int n;
      
method static SelfType@ New(editable INativeMemoryHost mem,IInteger value){
         
SelfType@ obj=mem#New SelfType;
         obj.n=value;
         
retref obj;
      }
   }
   
method void Use(){
      
MemoryHost mem;
      C@ c_obj=C::New(mem,5);
   } 

●クリアラー

   オブジェクトが消滅する時、暗黙にクリアラーが呼び出されます。
   消滅するオブジェクトのクラスにクリアラーが定義されていない場合は呼び出されません。
   オブジェクトがインスタンス変数を持つ場合、
   インスタンス変数のクリアラーはオブジェクトのクリアラーの後に実行されます。
   
   FGESのクリアラーはC++のデストラクタに近いものですが、
   グローバル変数などVM自体の終了まで消滅しないオブジェクトの
   クリアラーは呼び出されないことに注意する必要があります。
   一方、ローカル変数など確実に消滅するオブジェクトに対しては
   クリアラーの呼び出しが保証されるため、後処理を任せることが可能です。
   
   また、ネイティブクラスではC++レベルのクリアラーとして
   IFGESObject::DeleteFGESObject をオーバーライドして使用する必要があります。
   ネイティブクラスではFGESレベルのクリアラーは使用できません。

   クリアラーはクラス定義時に言語定義メソッド名 #Clear として定義します。
   クリアラーは戻り値型 void で引数を取らないメソッドである必要があります。
   なお、クリアラーでは戻り値型の記述を省略できます。

   例:
<  1>
<  2>
<  3>
   class C{
      
method #Clear(){} //クリアラーの定義
   } 


[前へ] [目次へ] [次へ]

最終更新 2017/04/16