オブジェクトの生成

Objectの生成は、次の構文により行います。

ObjectType[ : SubType] ObjectName;                                … 【1】
ObjectType[ : SubType] ObjectName[ n ];                           … 【2】

var 変数名 = new ObjectType[ : SubType];                          … 【3】
var 変数名 = new ObjectType[ : SubType] ();                       … 【4】
var 変数名 = new ObjectType[ : SubType] ( コンストラクタ引数 );   … 【5】

【1】と【2】の書式の場合、このプログラムを実行したオブジェクトが親オブジェクトとなる階層構造に接続され、ObjectNameで指定した名前を持つオブジェクトが生成されます。

[ : SubType] は省略可能なオプションで、オブジェクトに与える補助情報です。主に動的な値(valueプロパティ)を格納可能なクラスの型指定として利用されています。

SubTypeでの指定はsubTypeプロパティに格納され参照することが可能です。

SubTypeの指定をどう解釈するかはクラスに委ねられているため、詳細はクラスリファレンスの各クラスの解説を参照ください。


TextBox:Number b;
例えば、TextBoxでのSubTypeの指定はvalueプロパティを指定されたSubTypeの型とします。
上記の例では、数値型のデータとしてテキスト入力欄を生成します。
書式【2】の [n] は配列化を指定します。[]を付加するとオブジェクトは配列として生成され、nにより生成時の要素数を指定します。
【3】【4】【5】の書式の場合、生成されたオブジェクトのリファレンスがvar変数に格納されます。
この場合、オブジェクトは固有の名前を持たず、変数名でアクセスすることになります。
変数はオブジェクトの実体ではありませんので、状況により名前は変化します。

var text = new String("sample1");
var sample = text;
この例の場合、Stringオブジェクトはtextまたはsampleの名前で参照できます。
どちらもStringオブジェクトリファレンスで同じインスタンスを指します。
したがって、
text.value = "sample2";
print(sample);
とすると、print関数によりデバッガに表示されるのは、"sample2"となります。
../../_images/object02_image001.gif
書式【4】の場合、クラスのコンストラクタが呼び出され、デフォルトの初期化が行われます。
書式【5】の場合、コンストラクタ引数により、オブジェクトの初期化を指示することができます。
コンストラクタは、オブジェクトの種類により初期化する内容、指定する内容、意味、パラメータの数が変わります。

例 Arrayクラスのコンストラクタ

var a = new Array("aaa", "bbb", "ccc");

"aaa"、"bbb"、"ccc"がArray要素として生成されます。

例 Stringクラスのコンストラクタ

var s = new String("sample");

内容がsampleの文字列となります。

オブジェクトの初期化

Object生成と同時にプロパティ設定を行い初期化することができます。

/* オブジェクト生成/初期化後にオブジェクトツリーへ接続します */
DisplayType ObjectName {
    X = 10;
    Y = 10;
    Width = 20;
    Height = 20;
    :
}
/* オブジェクトの生成/初期化後に、デフォルトプロパティ値を変更しています */
DataType ObjectName = 10;
/* オブジェクトを生成/初期化し、var変数に格納します */
var rec = new Record {
    String str1 = "abc";
    Number num1 = 123;
};

下記の文法はBiz/Browser DT 1.1.0から追加されました。

/* オブジェクトを生成/初期化し、引数に直接渡します */
Function func(arg) { ... }
func( new String { value = "str"; Number val = 123; } );

クラスのプロパティには初期化後の変更ができないものがあります。このようなプロパティは必ず初期化で設定する必要があります。

オブジェクトの階層構造

ほとんどのオブジェクトは"//"(Rootオブジェクト)を基点とする階層構造に属します。
階層構造に新しいオブジェクトを付加するためには以下のように記述します。
DataType Object1 {
    DataType Object2 {
        DataType Object3 {
            :
        }
    }
}
../../_images/object02_image002.png
一部のオブジェクトは、階層構造に制約を持ちます。
例えば複数の選択肢の中から一つを選択するOptionButtonオブジェクトの場合、子として生成できるDisplayオブジェクトはOptionItemに限られます。
この制約は、OptionButtonオブジェクトは単独で選択肢を表現するのではなく、複数の選択肢の表示や状態を調停するOptionButtonオブジェクト、個々の選択肢を表現するOptionItemオブジェクトの複合体として選択肢を表現しているためです。

オブジェクトの名前

"//"(Rootオブジェクト)を基点とするオブジェクトツリーに含むオブジェクトには、名前を付けることができます。
オブジェクトの名前には以下の制約があります。
  1. 英字または全角の文字で始まること
  2. 2文字目以降は英数字、アンダースコア(_)または全角文字であること

正しい例

ABC
日本語のオブジェクト名
txt顧客コード
txt_custcode

不正な例

12_code           ← 数字で始まる
txt custcode      ← 空白文字を含む
txt-custcode     ← 記号を含む

全角文字の空白や記号は利用することができますが、間違いとなりやすいためできるだけ利用しないようにしてください。

全角文字の変数名は、環境によっては(UNIX系のOSでCRSソースを管理する場合など)文字化けして取り扱いが悪くなることがあります。ご注意ください。

オブジェクトの名の衝突

オブジェクト同士の衝突

新しいオブジェクトを生成した同じ階層に、すでに同じ名前のオブジェクトが存在する場合、既存のオブジェクトは自動的に削除されます。


プロパティとの衝突

プロパティ名と同じ名前で子オブジェクトを生成すると、オブジェクトの検索が優先されます。 プロパティはオブジェクトに隠れて利用することができなくなります。


メソッドとの衝突

メソッド名と同じ名前で子オブジェクトを生成すると、オブジェクトの検索が優先されます。 メソッドはオブジェクトに隠れて利用することができなくなります。


クラス名との衝突

クラス名と同じ名前のオブジェクトを生成すると、そのオブジェクトのスコープ内では、衝突したクラスのスタティックメソッドやスタティックプロパティにアクセスできなくなります。