このドキュメントでは、Caché が提供する関数 (内部関数) について説明します。 この関数は、クラスや、そのメソッドまたはプロパティへの参照を実行時に処理することにより、オブジェクトの処理の一般化を図ります。
ここでは、関数名はすべて大文字で表記されていますが、実際は大文字と小文字は区別しません。
$ZOBJCLASSMETHOD
Synopsis
$ZOBJCLASSMETHOD (Classname, Methodname, Arg1, Arg2, Arg3, ... )
この関数は、Caché ObjectScript プログラムが任意のクラス内の任意のクラスメソッドを呼び出すことを許可します。クラス名とメソッド名の両方は、実行時に処理されるか、文字列制約として提供されます。
メソッドが引数を持つ場合は、methodname の後の引数リストが引数を提供します。最大 255 の引数値がメソッドに渡されます。
有効な文字列として評価する式。文字列の内容は、既存のアクセスできる、既にコンパイルされたクラスの名前と正確に一致する必要があります。Caché クラスへの参照の場合、その名前はキャノニック形式 (%Library.String) か省略形式 (%String) のどちらかです。
有効な文字列として評価する式。文字列の値は、
Classname により特定される、クラス内の既存の ClassMethod の名前と一致する必要があります。
指定されたメソッドの引数に対し、順次置換される一連の式。式の値は、任意のタイプです。作成者は、提供された式のタイプはメソッドが予期するものと一致すること、また宣言された限界内に値があることを確認して下さい。
指定されたメソッドが引数を予期していない場合、この関数呼び出しで
MethodName 以外の引数を与える必要はありません。余分な引数は無視されます。
関数またはプロシージャとして
$ZOBJCLASSMETHOD を呼び出すと、ターゲット・メソッドの呼び出しを確定します。詳細は、以下の例を参考にしてください。
set ClassName = "%Dictionary.ClassDefinition"
set ClassmethodName = "NormalizeClassname"
set SingleArgument = "%String"
write $ZOBJCLASSMETHOD(ClassName, ClassmethodName, SingleArgument), !
$ZOBJMETHOD
Synopsis
$ZOBJMETHOD (Instance, Methodname, Arg1, Arg2, Arg3... )
この関数は、Caché ObjectScript プログラムが、あるクラスの既存のインスタンス内の任意のメソッドを呼び出すことを許可します。最初の引数はオブジェクトへの参照でなければならないため、実行時に算出されます。メソッド名は、実行時に算出されるか、文字列リテラルとして提供されます。メソッドが引数を持つ場合、これらは methodname の後の引数リストが提供します。最大 255 の引数値がメソッドに渡されます。メソッドに予期されていない余分な引数は、無視されます。
オブジェクト参照に評価する式。式の値は、希望するクラスのインメモリ・インスタンスの式でなければなりません。
有効な文字列として評価する式。文字列の値は、最初の引数で指定されたクラスのインスタンス内の、既存のメソッドの名前と一致する必要があります。
指定されたメソッドの引数に対し、順次置換される一連の式。式の値は、任意のタイプです。作成者は、提供された式のタイプはメソッドが予期するタイプと一致すること、また限界内に値があることを確認して下さい。
関数またはプロシージャとして
$ZOBJMETHOD を呼び出すと、ターゲット・メソッドの呼び出しを確定します。詳細は、以下の例を参考にしてください。
クラス・インスタンスの 1 つのメソッド内で、そのインスタンスの別のメソッドを参照するために使用するときは、
Instance が省略されることがあります。しかし、通常
Instance の後に続くコンマは必要です。
set ListOfStuff = ##class(%Library.ListOfDataTypes).%New()
for i = "First", "Second", "Third", "Fourth"
{
do ListOfStuff.Insert((i _ "-Element"))
}
set MethodName = "Count"
set Elements = $ZOBJMETHOD(ListOfStuff, MethodName)
write "Elements: ", Elements, !
set i = $RANDOM(Elements) + 1
write "Element #", i , " = " , $ZOBJMETHOD(ListOfStuff, "GetAt", i), !
$ZOBJPROPERTY
Synopsis
$ZOBJPROPERTY (Instance, Propertyname, Index1, Index2, Index3... )
この関数は、Caché ObjectScript プログラムが、あるクラスの既存のインスタンス内の任意のプロパティの値を選択することを許可します。最初の引数はクラスのインスタンスでなければならないため、実行時に算出されます。プロパティ名は、実行時に算出されるか、文字列リテラルとして提供されます。文字列の内容は、クラスで宣言されたプロパティの名前と正確に一致する必要があります。
プロパティが多次元であると宣言されている場合は、propertyname の後の引数は、多次元配列へのインデックスとして扱われます。最大で 255 の引数をインデックスに使用できます。
oref に評価する式。式の値は、希望するクラスのインメモリ・インスタンスの値でなければなりません。
有効な文字列として評価する式。文字列の値は、
Classname により特定される、クラス内で定義された既存のプロパティ名と一致する必要があります。
指定されたプロパティが多次元でない場合、余分な引数があると実行時にエラーが生じます。
メソッド内で、現在のインスタンスのプロパティを参照するために使用する場合は、
Instance が省略されることがあります。しかし、通常
Instance の後に続くコンマは必要です。
多次元と宣言されていないプロパティから多次元値を取得したり、設定しようとすると、
<FUNCTION> エラーが生じます。
set TestName = "%Library.File"
set ClassDef = ##class(%Library.ClassDefinition).%OpenId(TestName)
for i = "Name", "Super", "Persistent", "Final"
{
write i, ": ", $ZOBJPROPERTY(ClassDef, i), !
}
以下は、割り当て演算子の右と左の両方で使用する例です。
set TestFile = ##class(%Library.File).%New("AFile")
write "Initial file name: ", $ZOBJPROPERTY(TestFile, "Name"), !
set $ZOBJPROPERTY(TestFile, "Name") = $ZOBJPROPERTY(TestFile, "Name")
_ "Renamed"
write "File name afterward: ", $ZOBJPROPERTY(TestFile, "Name"), !