オブジェクト参照変数を操作する

オブジェクトを作成、管理、削除するには、オブジェクト参照変数を使用します。オブジェクト参照変数はクラスのデータ型を持ち、その他の変数と同様に記憶域内の名前の付いた領域です。ただし、他の変数とは異なり、その領域内に格納された値はオブジェクト自体ではなく、オブジェクトデータへの 4 バイトのポインタ (オブジェクト参照) です。このポインタはオブジェクトデータにアクセスするために使用されます。

クラスのインスタンスを作成する場合、オブジェクト参照変数を明示的に宣言する必要があります。つまり、オブジェクトとオブジェクト参照変数を作成して、オブジェクト参照を変数に割り当てます。

オブジェクト参照はオブジェクトを指し示します。オブジェクトが作成されると、そのメンバ変数はメンバのデータ型の初期値にそれぞれ初期化されます。例えば、Integer 型のメンバはゼロに初期化されます。メンバ自体がユーザー定義のデータ型またはユーザー定義のクラスの場合、そのメンバ変数を初期化することにより初期化されます。

オブジェクトを作成しなくても、次の構文を使用してオブジェクト参照を作成できます。

Dim x As ClassName

宣言する変数がまだ存在しないオブジェクトへの参照を含んでいるため、変数は値 NOTHING に初期化されます。

オブジェクトを作成する

クラスを定義した後で、LotusScript® の New キーワードを使用してオブジェクトを作成し、値を割り当てます。

オブジェクト参照変数の配列やオブジェクト参照変数のリストを宣言するために New キーワードを使用することはできません。

次の例では、X は Demo オブジェクトへの参照だけを保持でき、それ以外の場合は値 NOTHING になります。NOTHING に初期化されます。

Class Demo
 ' ...
End Class
' Declare an object reference variable X of the class
' Demo, create an instance of that class, and assign X
' a reference to the new Demo object.
Dim X As New Demo
Dim DemoArray(10) As Demo ' Array of object reference variables
Dim DemoList List As Demo ' List of object reference variables

DemoArray の各要素は NOTHING に初期化されます。ただし、リストは宣言されたときには要素を持たないため、DemoList の要素は初期化されません。DemoArray の各要素と DemoList の各要素は、作成されると、値 NOTHING か Demo オブジェクト参照のいずれかを保持できます。例えば次のようになります。

Set DemoArray(0) = New Demo

Set ステートメントを使用する

Set ステートメントは値 (オブジェクト参照) をオブジェクト参照変数に割り当てるだけのために使用される代入ステートメントです。その他のステートメントでは、オブジェクト参照変数に値を割り当てることはできません。

新しく作成されたオブジェクトへの参照を、配列要素またはリスト要素に割り当てることもできます。

次の例は、前の例の続きです。

Dim Z(10) As Demo 
' Declare an array of object reference variables.
Dim A List As Demo   
' Declare a list of object reference variables.
Set Z(1) = New Demo  
' Assign Z(1) a reference to the created object.
'Assign a list element a reference to the created object.
Set A("ITEM01") = New Demo

New キーワードなしの Set ステートメントを使用して、既存のオブジェクト参照を別の変数に割り当てられます。

以下に例を示します。

Class Customer
 ' ...
End Class
' Declare object reference variable C, create a Customer 	' object, and assign C a reference to the new Customer object.
Dim C As New Customer

' Declare object reference variable myArray and initialize
' all elements of MyArray to NOTHING.
Dim myArray(10) As Customer

Dim dTwo As Customer  ' Object reference is set to NOTHING.

Set dTwo = myArray(1) 
' Assign the myArray(1) value, NOTHING, to DTwo.

Set myArray(1) = C
' myArray(1) and C refer to the same Customer.

Set dTwo = myArray(1) 
' Now dTwo also refers to the same Customer.

Set myArray(1) = NOTHING 
' Set the object reference to NOTHING.
' Assign myArray(1) a reference to a new Customer object.
Set myArray(1) = New Customer
' Assign dTwo a reference to a new customer object.
' Now, variables C, myArray(1), and dTwo each refer to
' different Customer objects.
Set dTwo = New Customer

Set を使用した割り当てではオブジェクトはコピーされません。割り当てられた値は、オブジェクト自体ではなくオブジェクトへの参照です。オブジェクト参照変数に格納された値は、オブジェクトを構成するデータへのポインタです。Set は参照をターゲットの変数にコピーします。

Variant 型を使用してオブジェクト参照を保持する

オブジェクト参照を Variant 型の変数に割り当てられます。

次のスクリプトでは、変数 anyFruitV は Fruit オブジェクトへの参照を保持し、データ型は Variant 型です。スクリプトはユーザーが Notes のボタンをクリックすると実行されます。

Class Fruit
     Sub PrintColor
          MessageBox ("I have no color.")
     End Sub
End Class
Class Banana As Fruit
     Sub PrintColor
          MessageBox ("I'm yellow.")
     End Sub
End Class

Class Grape As Fruit
     Sub PrintColor
          MessageBox ("I'm purple.")
     End Sub
End Class
Sub Click(Source As Button)    ' Sample Notes product object.
     Dim myFruit As New Fruit
     Dim myBanana As New Banana
     Dim myGrape As New Grape
     
     Dim anyFruitV As Variant
     
     Set anyFruitV = myFruit
     anyFruitV.PrintColor
     
     Set anyFruitV = myBanana
     anyFruitV.PrintColor
     
     Set anyFruitV = myGrape
     anyFruitV.PrintColor
End Sub

クロスリファレンス

LotusScript 言語の Testing オブジェクト参照