Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

オブジェクト特有の ObjectScript の機能

ObjectScript には、クラスおよびオブジェクトの操作に特有の機能が含まれています。以下のとおりです。

  • 相対ドット構文 (..) — プロパティにアクセスするために使用したり、現在のオブジェクトのメソッドを呼び出すために使用します。

  • ##Class 構文 — クラス・メソッドを呼び出すために使用したり、別のクラスとしてオブジェクト参照をキャストしてメソッドを呼び出すために使用したり、クラス・パラメータの値にアクセスするために使用します。

  • $this 構文 — 現在のインスタンスの OREF へのハンドルを取得するために使用します。例えば、現在のインスタンスを別のクラスに渡したり、別のクラスが現在のインスタンスのプロパティやメソッドを参照するために使用します。

  • ##super 構文 — サブクラス・メソッド内から、スーパークラス・メソッドを呼び出すために使用します。

  • オブジェクトへの動的アクセス — クラス・メソッドとインスタンス・メソッドの呼び出し、およびオブジェクト・プロパティの参照に使用

  • i%<PropertyName> 構文Get または Set アクセサ・メソッド内から、インスタンス変数を参照するために使用します。または、その Get または Set メソッドをバイパスするために使用します。

  • ..#<Parameter> 構文 — 同じクラスのメソッド内でクラス・パラメータの値を参照するために使用します。

このドキュメントをオンラインで表示している場合は、このドキュメントの "序文" を使用すると、関連のあるトピックをすばやく見つけることができます。

相対ドット構文 (..)

相対ドット構文 (..) は、現在のコンテキストのメソッドやプロパティを参照するメカニズムを提供します。インスタンス・メソッドまたはプロパティのコンテキストは、現在のインスタンスです。クラス・メソッドのコンテキストは、メソッドが実装されているクラスです。クラス・メソッドで相対ドット構文を使用してプロパティやインスタンス・メソッドを参照することはできません。これらを参照するにはインスタンス・コンテキストが必要です。

例えば、%Integer タイプの Bricks プロパティがあるとします。

Property Bricks As %Integer;

CountBricks() メソッドは、相対ドット構文を使用して Bricks を参照できます。

Method CountBricks()
{
    Write "There are ",..Bricks," bricks.",!
}

同様に、WallCheck() メソッドは CountBricks() および Bricks を参照できます。

Method WallCheck()
{
    Do ..CountBricks()
    If ..Bricks < 100 {
        Write "Your wall will be small."
    }
}

##Class 構文

##class 構文により、以下が可能になります。

Note:

##class は、大文字と小文字を区別しません。

クラス・メソッドの呼び出し

クラス・メソッドを呼び出すには、以下のどちらかの構文を使用します。

>Do ##class(Package.Class).Method(Args)
>Set localname = ##class(Package.Class).Method(Args)

以下のように、式の一部に ##class を使用することもできます。

 Write ##class(Class).Method(args)*2

変数を、返り値と同じ値に設定する必要はありません。

新規のインスタンスの生成において、この構文を頻繁に使用します。

>Set LocalInstance = ##class(Package.Class).%New()

メソッドのキャスト

あるクラスのメソッドを、別のクラスのメソッドとしてキャストするには、以下のどちらかの構文を使用します。

>Do ##class(Package.Class1)Class2Instance.Method(Args)
>Set localname = ##class(Package.Class1)Class2Instance.Method(Args)

クラス・メソッドとインスタンス・メソッドの両方ともキャストできます。

例えば、2 つのクラス MyClass.UpMyClass.Down が、両方とも Go() メソッドを持つとします。 MyClass.Up の場合は、このメソッドが以下のようになります。

Method Go()
{
    Write "Go up.",!
}

MyClass.Down の場合は、Go() メソッドが以下のようになります。

Method Go()
{
    Write "Go down.",!
}

ユーザは、MyClass.Up のインスタンスを生成することができ、これを使用して MyClass.Down.Go メソッドを呼び出します。

>Set LocalInstance = ##class(MyClass.Up).%New()
 
>Do ##class(MyClass.Down)LocalInstance.Go()
Go down.

以下のように、式の一部に ##class を使用することもできます。

 Write ##class(Class).Method(args)*2

変数を、返り値と同じ値に設定する必要はありません。

さらに一般的なメソッド参照方法として、インスタンス・メソッドを参照する $METHOD 関数およびクラス・メソッドを参照する $CLASSMETHOD 関数があります。この章後半の “オブジェクトへの動的アクセス” にこれらの関数について詳しい説明があります。これらは、プログラム的にパッケージ、クラス、メソッドを参照するメカニズムを提供します。

クラス・パラメータへのアクセス

クラス・パラメータにアクセスするには、以下の式を使用します。

##class(Package.Class).#PARMNAME

Package.Class はクラスの名前です。また、PARMNAME はパラメータの名前です。以下に例を示します。

 w ##class(%XML.Adaptor).#XMLENABLED

この例では、XML アダプタによって生成されたメソッドが XML 対応Opens in a new tabかどうかが表示されます。既定の設定は 1 です。

$PARAMETER 関数も使用できます。この関数については、この章で後述する “オブジェクトへの動的アクセス” を参照してください。

$this 構文

$this 変数は、現在のインスタンスの OREF へのハンドルを提供します。例えば、現在のインスタンスを別のクラスに渡したり、別のクラスが現在のインスタンスのプロパティやメソッドを参照するために使用します。インスタンスが、そのインスタンスのプロパティやメソッドを参照する場合は、相対ドット構文のほうが高速であるために推奨されています。

Note:

$this は大文字と小文字を区別しません。このため、$this$This$THIS、およびその他の変異形は同じ値を持ちます。

例えば、Accounting.Order クラスと Accounting.Utils クラスを持つアプリケーションがあるとします。Accounting.Order.CalcTax() メソッドは、Accounting.Utils.GetTaxRate() メソッドおよび Accounting.Utils.GetTaxableSubtotal() メソッドを呼び出し、現在のインスタンスの "city" と "state" の値を GetTaxRate() メソッドに渡し、注文された品目と関連する税金関係の情報のリストを GetTaxableSubtotal() に渡します。CalcTax() は、返された値を使用して、注文に対する消費税を算出します。従って、コードは以下のようになります。

Method CalcTax() As %Numeric
{
    Set TaxRate = ##class(Accounting.Utils).GetTaxRate($this)
    Write "The tax rate for ",..City,", ",..State," is ",TaxRate*100,"%",!
    Set TaxableSubtotal = ##class(Accounting.Utils).GetTaxableSubTotal($this)
    Write "The taxable subtotal for this order is $",TaxableSubtotal,!
    Set Tax = TaxableSubtotal * TaxRate
    Write "The tax for this order is $",Tax,!
}

メソッドの最初の行では、##Class 構文 (前述) を使用して、クラスの別のメソッドを呼び出しています。ここでは $this 構文を使用して、そのメソッドに現在のオブジェクトを渡します。メソッドの 2 行目では、相対ドット構文を使用して、City プロパティと State プロパティの値を取得します。3 行目の動作は、1 行目と同様です。

Accounting.Utils クラスの GetTaxRate() メソッドは、渡されたインスタンスのハンドルを使用して、さまざまなプロパティへのハンドルを (値を取得したり設定したりするために) 取得できます。

ClassMethod GetTaxRate(OrderBeingProcessed As Accounting.Order) As %Numeric
{
    Set LocalCity = OrderBeingProcessed.City
    Set LocalState = OrderBeingProcessed.State
    // code to determine tax rate based on location and set
    // the value of OrderBeingProcessed.TaxRate accordingly
    Quit OrderBeingProcessed.TaxRate
}

GetTaxableSubtotal() もインスタンスのハンドルを使用し、そのプロパティを確認して TaxableSubtotal プロパティの値を設定します。

したがって、Accounting.Order クラスの MyOrder インスタンスに対して CalcTax() メソッドを呼び出すと、ターミナルに以下のような出力が表示されます。

>Do MyOrder.CalcTax()
The tax rate for Cambridge, MA is 5%
The taxable subtotal for this order is $79.82
The tax for this order is $3.99

##super 構文

サブクラス・メソッドは、スーパークラス・メソッドをオーバーライドするとします。サブクラス・メソッド内から、オーバーライドされたスーパークラス・メソッドを呼び出すには ##super() 構文を使用できます。

Note:

##super は、大文字と小文字を区別しません。また、この章で説明するその他の機能とは異なり、##super() は ObjectScript メソッド内で使用できるだけでなく、Basic メソッド内でも使用できます

例えば、MyClass.Down クラスが MyClass.Up のサブクラスで、Simple クラス・メソッドをオーバーライドするとします。 MyClass.Up.Simple() のコードが以下のとおりで、

ClassMethod Simple()
{
    Write "Superclass.",!
}

MyClass.Down.Simple() のコードが以下のとおりである場合、

ClassMethod Simple()
{
    Write "Subclass.",!
    Do ##super()
}

サブクラス・メソッド MyClass.Down.Simple() の出力は、以下のようになります。

>Do ##Class(MyClass.Down).Simple()
Subclass.
Superclass.
>

さらに一般的なメソッド参照方法として、インスタンス・メソッドを参照する $METHOD 関数およびクラス・メソッドを参照する $CLASSMETHOD 関数があります。この章後半の “オブジェクトへの動的アクセス” にこれらの関数について詳しい説明があります。これらは、プログラム的にパッケージ、クラス、メソッドを参照するメカニズムを提供します。

##super が作用する呼び出し

##super は、現在のメソッド呼び出しにのみ作用します。そのメソッドで他の呼び出しを実行する場合、それらの呼び出しは、スーパークラスに対してではなく、現在のオブジェクトまたはクラスに対して実行されます。例えば、以下のように、MyClass.UpMyName() メソッドと CallMyName() メソッドがあるとします。

Class MyClass.Up Extends %Persistent
{

ClassMethod CallMyName()
{
    Do ..MyName()
}

ClassMethod MyName()
{
    Write "Called from MyClass.Up",!
}

}

また、以下のように、MyClass.Down で上記のメソッドをオーバーライドするとします。

Class MyClass.Down Extends MyClass.Up
{

ClassMethod CallMyName()
{
    Do ##super()
}

ClassMethod MyName()
{
    Write "Called from MyClass.Down",!
}

}

ここで、CallMyName() メソッドを呼び出すと、以下のような結果が返されます。

USER>d ##class(MyClass.Up).CallMyName()
Called from MyClass.Up
 
USER>d ##class(MyClass.Down).CallMyName()
Called from MyClass.Down

MyClass.Down.CallMyName() の出力は、MyClass.Up.CallMyName() とは異なっています。これは、MyClass.Down.CallMyName()CallMyName() メソッドには ##super が含まれており、MyClass.Up.CallMyName() メソッドを呼び出した後、キャストされない MyClass.Down.MyName() メソッドを呼び出しているからです。

##super と メソッドの引数

##super は、引数を許可するメソッドでも機能します。サブクラス・メソッドで引数の既定値を指定していない場合は、そのメソッドがスーパークラスへの参照で引数を渡していることを確認します。

例えば、スーパークラス (MyClass.Up.SelfAdd()) のメソッドのコードが以下のとおりだとします。

ClassMethod SelfAdd(Arg As %Integer)
{
    Write Arg,!
    Write Arg + Arg
}

出力は、以下のようになります。

>Do ##Class(MyClass.Up).SelfAdd(2)
2
4
>

サブクラス (MyClass.Down.SelfAdd()) のメソッドでは、##super を使用し、引数を参照で渡します。

ClassMethod SelfAdd(Arg1 As %Integer)
{
    Do ##super(.Arg1)
    Write !
    Write Arg1 + Arg1 + Arg1
}

出力は、以下のようになります。

>Do ##Class(MyClass.Down).SelfAdd(2)
2
4
6
>

MyClass.Down.SelfAdd() では、引数名の前にあるピリオドに注目してください。これを省略して、引数を指定せずにメソッドを呼び出すと、<UNDEFINED> エラーを受け取ることになります。

オブジェクトへの動的アクセス

Caché は、オブジェクトに対する一般的な処理をサポートするいくつかの関数を提供します。このサポートは、クラスおよびそのメソッド、プロパティへの参照を実行時に操作することで実現しています。これを Java ではリフレクションといいます。これらの関数は以下のとおりです。

  • $CLASSNAME — クラス名を返します。

  • $CLASSMETHOD — クラス・メソッドへの呼び出しをサポートします。

  • $METHOD — インスタンス・メソッドへの呼び出しをサポートします。

  • $PARAMETER — 指定されたクラスのクラス・パラメータの値を返します。

  • $PROPERTY — インスタンスの特定のプロパティへの参照をサポートします。

ここでは、関数名はすべて大文字で表記されていますが、実際には大文字と小文字は区別されません。

$CLASSNAME

この関数はクラス名を返します。このシグニチャは以下のようになります。

$CLASSNAME(Instance)

Instance は OREF です。

詳細は、"Caché ObjectScript リファレンス" の "$CLASSNAME" のページを参照してください。

$CLASSMETHOD

この関数は、指定されたクラスにある指定されたクラス・メソッドを実行します。 このシグニチャは以下のようになります。

$CLASSMETHOD (Classname, Methodname, Arg1, Arg2, Arg3, ... )

以下はその説明です。

Classname 既存のクラス。
Methodname 最初の引数で指定したクラスのメソッド。
Arg1Arg2Arg3、... 指定したメソッドへの引数を置き換える一連の式。

詳細は、"Caché ObjectScript リファレンス" の "$CLASSMETHOD" のページを参照してください。

$METHOD

この関数は、指定されたクラスの指定されたインスタンスで、指定されたインスタンス・メソッドを実行します。このシグニチャは以下のようになります。

$METHOD (Instance, Methodname, Arg1, Arg2, Arg3, ... )

以下はその説明です。

Instance クラスのインスタンスの OREF。
Methodname 最初の引数のインスタンスで指定したクラスのメソッド。
Arg1Arg2Arg3、... 指定したメソッドへの引数を置き換える一連の式。

詳細は、"Caché ObjectScript リファレンス" の "$METHOD" のページを参照してください。

$PARAMETER

この関数は、指定されたクラスのクラス・パラメータの値を返します。このシグニチャは以下のようになります。

$PARAMETER(Instance,Parameter)

以下はその説明です。

Instance クラスの完全修飾名、またはクラスのインスタンスの OREF のどちらか。
Parameter 指定されたクラスのパラメータ。

詳細は、"Caché ObjectScript リファレンス" の "$PARAMETER" のページを参照してください。

$PROPERTY

この関数は、指定されたクラスにあるインスタンスで、プロパティの値を取得または設定します。プロパティが多次元の場合、プロパティの値にアクセスする時のインデックスとして、プロパティ名に続く引数を使用します。このシグニチャは以下のようになります。

$PROPERTY (Instance, PropertyName, Index1, Index2, Index3... )

各要素の内容は以下のとおりです。

Instance クラスのインスタンスの OREF。
PropertyName 最初の引数のインスタンスで指定したクラスのプロパティ。
Index1Index2Index3... 多次元プロパティの場合、プロパティが表す配列へのインデックス。

詳細は、"Caché ObjectScript リファレンス" の "$PROPERTY" のページを参照してください。

i%<PropertyName> 構文

このセクションでは、インスタンス変数の追加情報について説明します。このような変数は、プロパティのアクセサ・メソッドをオーバーライドしていない場合は参照する必要がありません。これについては、“プロパティ・メソッドの使用とオーバーライド” の章を参照してください。

どのようなクラスのインスタンスを作成するときでも、システムは、そのクラスの非計算プロパティごとに 1 つのインスタンス変数を作成します。インスタンス変数は、プロパティの値を保持します。プロパティ PropName の場合、インスタンス変数には i%PropName という名前が付けられます。この変数名は、大文字と小文字が区別されます。このような変数は、クラスのインスタンス・メソッド内で使用できます。

例えば、あるクラスにプロパティ NameDOB がある場合は、そのクラスのあらゆるインスタンス・メソッド内で、インスタンス変数 i%Namei%DOB を使用できます。

Caché では、r%PropNamem%PropName という名前の付いた追加のインスタンス変数も内部的に使用しますが、このような変数の直接使用はサポートされていません。

インスタンス変数は、その変数に割り当てられたプロセス・プライベートのメモリ内ストレージを保持します。このような変数は、ローカル変数シンボル・テーブルに保持されないため、Kill コマンドの影響は受けません。

..#<Parameter> 構文

..#<Parameter> 構文を使用すると、同じクラスのメソッド内からクラス・パラメータを参照できます。

例えば、クラス定義に以下のパラメータおよびメソッドが含まれているとします。

Parameter MyParam = 22;

そして、以下のメソッドも含まれているとします。

ClassMethod WriteMyParam()
{
    Write ..#MyParam
}

この場合、WriteMyParam() メソッドは、引数として MyParam パラメータの値を含む Write コマンドを呼び出します。

FeedbackOpens in a new tab