オブジェクトの作成 - 新規オブジェクトの作成
|
使い方
|
|
module NewObject() option object; ... end module;
Object( obj )
Object( obj, ... )
|
|
新規クラスの宣言
|
|
•
|
オブジェクトの新規クラスを作成するには、module 宣言構文および add オプションオブジェクト を使用します。モジュールを使用すると、名前は local および export 文で宣言されます。オブジェクトの local 名はクラス宣言内のメソッドからのみアクセス可能で、export 名はどこからでもアクセス可能です。
|
•
|
オブジェクトでは名前は第二修飾子、static を持つことがあります。static 修飾子は、名前に割り当てられた値が同じクラスの複数オブジェクト間で共有される方法に影響を与えます。static 修飾子なしの名前は、オブジェクトに関係する値を持ちます。そのため各オブジェクトは名前に対する独自の値を保存します。static 修飾子付きの名前は、クラスに関係する値を持つため、同じクラスの各オブジェクトはその名前に対して同じ値を共有します。
|
•
|
メソッドはオブジェクト間で同じなので、static は通常オブジェクトのメソッドについて使用されます。オブジェクトの状態を含む名前を持つオブジェクトのデータ要素は、通常 static 修飾子を持ちません。しかし、static データ要素 (クタスを持つことに意味がある場合があります (作成されたオブジェクト数を記録するクラスの幅のカウンター)。
|
•
|
オプションオブジェクト付きの module 宣言の実行結果は、宣言したクラスの新規オブジェクトになります。このオブジェクトは、主に同じクラスの新規オブジェクトの作成に使用される特殊なプロトタイプオブジェクトとして扱われます。module 構文によって名前を指定することができます。この名前は、割り当てられたプロトタイプオブジェクトを含み、保護されます。
|
|
複数オブジェクトを作成
|
|
•
|
プロトタイプオブジェクトがある場合は、Object ルーチンを使用して新規オブジェクトを作成するために使用されます。デフォルトでは、新規オブジェクトの名前はプロトタイプの名前と同じです。オブジェクトは、ModuleCopy メソッドを定義して、Object 関数が呼び出されるときに新規オブジェクトの初期化方法を変更します。Object ルーチンは、ModuleCopy メソッドに渡される追加引数を受け付けます。
|
•
|
新規オブジェクトの作成のための良い方法は、ModuleApply メソッドを使用することです。ModuleApply で Object を呼び出すと、プロトタイプオブジェクトの名前を適用して新規オブジェクトを作成できます。
|
|
|
|
例
|
|
つぎの例は、本ページの概念を説明したものです。
>
|
module Dollar()
option object;
local value := 0;
local total::static := 0;
export amount::static := proc( self::Dollar, $ )
return self:-value;
end;
export in_circulation::static := proc( self::Dollar, $ )
total;
end;
export ModuleApply::static := proc( )
Object( Dollar, _passed );
end;
export ModuleCopy::static := proc( new::Dollar, proto::Dollar, v::numeric, $ )
new:-value := v;
total := total + new:-value;
end;
end:
|
プロトタイプオブジェクトを作成し、Dollar という名前を割り当てます。
>
|
in_circulation( Dollar );
|
| (1) |
Object ルーチンは、Dollar の新規インスタンスの作成に使用されます。
>
|
d1 := Object( Dollar, 1 );
|
| (2) |
新規の Dollar オブジェクトを作成すると、static変数 total の値が増加します。
>
|
in_circulation( Dollar );
|
| (3) |
Dollar が ModuleApply メソッドを実装して新規インスタンスを作成すると、以下の構文も使用されます。
| (4) |
ローカルな値は Dollar メソッドの外からはアクセスできません。
Error, module `module Dollar () local value; local total::static; export amount::static, in_circulation::static, ModuleApply::static, ModuleCopy::static; option object; value := 0; total := 6; amount := proc (self::Dollar, $) return self:-value end proc; in_circulation := proc (self::Dollar, $) Dollar:-total end proc; ModuleApply := proc () Object(Dollar,args) end proc; ModuleCopy := proc (new::Dollar, proto::Dollar, v::numeric, $) new:-value := v; Dollar:-total := Dollar:-total+new:-value end proc; end module` does not export `value`
| |
amount メソッドを使用すると、Dollar オブジェクトの値が出力されます。
| (5) |
| (6) |
ローカルな static total は Dollar のすべてのインスタンスで共有されるため、Dollar を in_circulation に渡し、同じ結果を得ることができます。
>
|
in_circulation( Dollar );
|
| (7) |
| (8) |
|
|
Download Help Document
Was this information helpful?