Method MyMethod(argument1, ByRef argument2, Output argument3)
ByRef キーワードは、参照によってこの引数を渡すことを示します。Output キーワードは、この引数を参照によって渡すことと、この引数に最初に指定した値がメソッドによってすべて無視されることを示します。
同様に、メソッドを定義するときに、メソッド・シグニチャで ByRef および Output キーワードを使用すると、そのメソッドの他のユーザに、それをどのように使用することを意図しているのかを知らせることができます。
ObjectScript で引数を参照渡しするには、そのメソッドを呼び出すときに変数名の前にピリオドを付けます。Python では、渡す値に対して iris.ref() を使用し、その参照に対してメソッドを呼び出します。これら両方を以下の例に示します。
Do MyMethod(arg1, .arg2, .arg3)
arg2=iris.ref("peanut butter")
arg3=iris.ref("jelly")
MyMethod(arg1,arg2,arg3)
Important:
ByRef および Output キーワードは、インターシステムズ・クラス・リファレンスの利用者全員に役立つ情報を提供します。これらのキーワードは、コードの動作には影響しません。メソッドの呼び出し方法に関する規則を適用するのは、メソッドの作成者の責任です。
可変の引数
引数の個数を変えることができるメソッドを定義できます。以下はその例です。
ClassMethod MultiArg(Arg1... As %List) [ Language = objectscript ]
{
Set args = $GET(Arg1, 0)
Write "Invocation has ",
args,
" element",
$SELECT((args=1):"", 1:"s"), !
For i = 1 : 1 : args
{
Write "Argument[", i , "]: ", $GET(Arg1(i), "<NULL>"), !
}
}
ClassMethod MultiArg(Arg1... As %List) [ Language = Python ]
{
print("Invocation has", len(Arg1), "elements")
for i in range(len(Arg1)):
print("Argument[" + str(i+1) + "]: " + Arg1[i])
}
既定値の指定
ObjectScript または Python メソッドで引数の既定値を指定するには、以下の例に示す構文を使用します。
Method Test(flag As %Integer = 0)
{
//method details
}
メソッドが呼び出されるとき、引数が指定されていない場合は既定値を使用します (既定値が指定されている場合)。メソッドが Python で記述されている場合、既定値を持つ引数は、引数リストの末尾に定義する必要があります。
ObjectScript では、$GET 関数を使用して既定値を設定することもできます。以下はその例です。
Method Test(flag As %Integer)
{
set flag=$GET(flag,0)
//method details
}
ただし、この方法ではシグニチャに影響しません。
メソッド・ジェネレータ
メソッド・ジェネレータは、クラスのコンパイル中にクラス・コンパイラによって呼び出されるプログラムです。この出力は、メソッドの実際の実行時実装です。メソッド・ジェネレータは強力なクラス継承の方法を提供し、クラスやプロパティ継承の必要性に応じてカスタマイズされた、高性能で特別なコードを生成します。InterSystems IRIS ライブラリ内で、メソッド・ジェネレータは、データ型やストレージ・クラスによって広範囲に使用されます。
クラス・クエリ
InterSystems IRIS クラスには、クラス・クエリを含めることができます。クラス・クエリは、クラスが使用できる SQL クエリを定義し、クエリのためのコンテナとして使用するクラスを指定します。以下に例を示します。
Query QueryName(Parameter As %String) As %SQLQuery
{
SELECT MyProperty, MyOtherProperty FROM MyClass
WHERE (MyProperty = "Hello" AND MyOtherProperty = :Parameter)
ORDER BY MyProperty
}
アプリケーションで使用するための事前に定義された検索を提供するために、クラス・クエリを定義します。例えば、名前などの複数のプロパティによってインスタンスを検索したり、パリからマドリッドまでのすべての航空便など、一連の特定の条件に適合するインスタンスのリストを提供したりできます。ここに示した例では、パラメータを使用します。これは、柔軟なクエリを提供するための一般的な方法です。クラス・クエリはどのクラス内でも定義できます。クラス・クエリは永続クラス内に含める必要はありません。これについては、このドキュメントで後述します。
XData ブロック
XML は、多くの場合、構造化されたデータを表すための便利な方法であるため、InterSystems IRIS クラスには、どのようなニーズに対しても整形式 XML ドキュメントを含めることを可能にするメカニズムがあります。このためには、もう 1 つの種類のクラス・メンバである XData ブロックを含めます。
InterSystems IRIS は、特定の目的のために XData ブロックを使用します。場合によっては、これらをユーザ自身のアプリケーションに活用することができます。
-
InterSystems IRIS Web サービスおよび Web クライアントに対する WS-Policy サポート。"Web サービスおよび Web クライアントの作成" を参照してください。この場合、XData ブロックはセキュリティ・ポリシーを記述します。
-
Business Intelligence では、XData ブロックを使用してキューブ、サブジェクト領域、KPI、およびその他の要素を定義します。
詳細は、"XData ブロックの定義と使用" を参照してください。
クラス定義におけるマクロとインクルード・ファイル
InterSystems IRIS クラス定義では、ObjectScript メソッド内にマクロを定義し、それらのマクロをそのメソッド内で使用できます。ただし、多くの場合、それらをインクルード・ファイル内で定義し、それをクラス定義の先頭でインクルードできます。以下はその例です。
Include (%assert, %callout, %occInclude, %occSAX)
/// Implements an interface to the XSLT Parser. XML contained in a file or binary
/// stream may be transformed
Class %XML.XSLT.Transformer Extends %RegisteredObject ...
その後、そのクラスの ObjectScript メソッドは、そのインクルード・ファイル、またはそれにインクルードされたインクルード・ファイルに定義されたマクロを参照できます。
マクロは継承されます。つまり、サブクラスは、そのスーパークラスと同じマクロすべてにアクセスできます。
InterSystems IRIS における継承規則
他のクラスベースの言語と同様に、複数のクラス定義を継承によって結合できます。InterSystems IRIS クラス定義は、複数の他のクラスを拡張 (または他のクラスから継承) できます。また、それらのクラスが他のクラスを拡張することもできます。
InterSystems IRIS クラスは、Python で定義されたクラス (つまり、.py ファイルに含まれるクラス定義) から継承することはできません (逆の場合も同様です)。
以下のサブセクションでは、InterSystems IRIS のクラスにおける継承の基本規則について説明します。
継承順序
InterSystems IRIS では、継承順序に次の規則を使用します。
-
既定では、特定の名前のクラス・メンバが複数のスーパークラスで定義されている場合、そのサブクラスはスーパークラス・リストの左端のクラスから定義を取ります。
-
クラス定義に Inheritance = right が含まれている場合、サブクラスはスーパークラス・リストの右端のクラスから定義を取ります。
これまでの使用法により、大部分の InterSystems IRIS クラスには、Inheritance = right が含まれています。
プライマリ・スーパークラス
他のクラスを拡張するクラスはすべて、1 つのプライマリ・スーパークラスを持っています。
クラスで使用される継承順序に関係なく、プライマリ・スーパークラスは、左から右に読む場合の最初のクラスです。
どのクラス・レベルのコンパイラ・キーワードについても、指定されたクラスは、そのプライマリ・スーパークラスで指定された値を使用します。
永続クラスの場合、プライマリ・スーパークラスは特に重要です。"クラスとエクステント" を参照してください。
最も適切なタイプのクラス
あるオブジェクトが複数のクラスのエクステント (いくつかのスーパークラスのエクステントなど) に属するインスタンスである場合でも、そのオブジェクトには必ず最も適切なタイプのクラス (MSTC) があります。オブジェクトがクラスのインスタンスであるが、そのクラスのどのサブクラスのインスタンスにもなっていない場合、そのクラスはそのオブジェクトの最も適切なタイプのクラスになります。
メソッドのオーバーライド
クラスは、その 1 つまたは複数のスーパークラスからメソッド (クラスおよびインスタンス・メソッドの両方) を継承し、それらはオーバーライドできます。その場合、自身のメソッド定義のシグニチャが、オーバーライドするメソッドのシグニチャと一致していることを確認する必要があります。サブクラス・メソッドの各引数は、スーパークラス・メソッドの引数と同じデータ型を使用するか、そのデータ型のサブクラスを使用する必要があります。ただし、サブクラスのメソッドで、そのスーパークラスに定義されていない追加の引数を指定することはできます。
メソッドのシグニチャが一致する限り、ObjectScript で記述されているメソッドを Python メソッドでオーバーライドすることも、その逆を行うこともできます。
サブクラスのメソッド内で、スーパークラス内のそれがオーバーライドしたメソッドを参照できます。ObjectScript でそれを行うには、##super() 構文を使用します。以下はその例です。
//overrides method inherited from a superclass
Method MyMethod() [ Language = objectscript ]
{
//execute MyMethod as implemented in the superclass
do ##super()
//do more things....
}
Note:
##super は、大文字と小文字を区別しません。
詳細
これらのトピックの詳細は、以下のリソースを参照してください。
-
"クラスの定義と使用" では、InterSystems IRIS でのクラスおよびクラス・メンバの定義方法について説明しています。
-
"クラス定義リファレンス" には、クラス定義で使用するコンパイラ・キーワードのリファレンス情報があります。
-
"インターシステムズ・クラス・リファレンス" には、InterSystems IRIS で提供されるすべての非内部クラスに関する詳細があります。