クラスを使うと、テンプレートに基づいてオブジェクトを作成することができます。クラスの定義は、JSLを使って作成できます。クラスの定義は、メンバー変数、メソッド、関数の定義を含むテンプレートです。JSLでクラスを定義したら、そこで定義されているすべての特徴を持ったオブジェクトのインスタンスが作成できます。
JSLクラス定義を作成するには、JSL関数のDefine Class()を使用します。JSLクラスのインスタンスを作成するには、JSL関数のNew Object()を使用します。
JSL関数Define Class()には、クラスの内容を定義するいくつかの引数があります。
Define Class( "class name",
<Base Class( "base class name", <"base class name", ...> ),>
<Show( All( Boolean ) ) | Show( <Members( Boolean ),> <Methods( Boolean ),> <Functions( Boolean )> ),>
<Assignment Statements>
);
ここで
• 「class name」 は定義するクラスの名前です。
• 「base class name」は、作成されるクラスの元として使用される基底クラスのセットを作る1つ以上のクラス名です。
• ShowはShow()関数、Print()関数、またはWrite()関数を使用してクラスオブジェクトを書き出すときに表示される値を定義します。次のようなオプションがあります。
– All( Boolean )は、クラスオブジェクトインスタンスで定義されるすべてのメンバー、メソッド、および関数を示します。Allのデフォルト値は真です。Allオプションが指定されている場合、その設定によってShowオプションのその他の引数が上書きされます。
– Members( Boolean )は、クラスオブジェクトインスタンスに含まれるすべてのメンバー変数を表示します。
– Methods( Boolean )は、クラスオブジェクトインスタンスに含まれるすべてのメソッドを表示します。
– Functions( Boolean )クラスオブジェクトインスタンスに含まれるすべての関数を表示します。
注: Allオプション、または任意の数のMembers、Methods、およびFunctionsのいずれかのオプションを指定することは可能ですが、Allオプションとその他のオプションを同時に指定することはできません。
注: クラスに_show_メソッドが含まれる場合は、そのメソッドによってShowオプションが上書きされます。
• Assignment Statementsには、次のような代入文の形式を指定することができます。
– Member = JSL Expression
– Method Name = Method( {<argument, ...>}, body )
– Function Name = Function( {<argument, ...}, {<local variable, ...>}, body )
注: Assignment StatementsをJSL式のリストで指定することもできます。
クラス定義では、3つの特殊なメソッドが使用できます。
_init_
インスタンスの作成時にオブジェクトを初期化します。これはクラスのコンストラクタとみなされます。クラスごとにコンストラクタを1つだけ持つことができます。
_show_
クラスのインスタンスを引数として使用した場合のJSL関数Show()、Print()、Write()の出力を定義します。
_to string_
クラスのインスタンスを引数として使用した場合のJSL関数Char()の出力を定義します。
注:
• すべてのメソッド、メンバー変数、および関数は公開されています。
• クラス内で定義された関数は、そのクラス内のメソッド変数またはメソッドにアクセスできません。
次の例では、名前、品種、色の情報を含むペットのクラスを定義します。
この例では、新しいペットのオブジェクトを作成するためのすべての情報を必要とするコンストラクタを定義しています。また、一連のアクセサメソッドを定義して、Petオブジェクトの各属性を取得します。
Define Class( "Pet",
name = ""; breed = ""; color = "";
_init_ = Method( { name, breed, color },
this:name = name;
this:color = color;
this:breed = breed;
);
_show_ = Method( {},
Return( name || "は、" || color || "の" || breed || "です。" )
);
Get Pet Name = Method( {}, Return( name ) )
);
JSLクラスオブジェクトのインスタンスを作成するには、JSL関数のNew Object()と、次の関数および引数を使用します。
New Object( "Class Name"( constructor arguments ) );
New Object( Class Name( constructor arguments ) );
New Object( Class Reference( constructor arguments ) );
New Object( "Class Name", { constructor arguments } );
New Object( Class Name, { constructor arguments } );
New Object( Class Reference, { constructor arguments } );
次の例は、JSLクラスオブジェクトを作成してそれにアクセスするためのクラスのインスタンスの作成方法を示します。
class = "Pet";
xa = New Object( Pet( "オリバー", "シュナウザー", "黒" ) );
xb = New Object( class, { "フリン", "コカプードル", "茶色" } );
xc = New Object( class( "マンディ", "キャバリア", "赤" ) );
xd = New Object( "Pet"( "チャーリー", "アジア種", "白" ) );
xd1 = New Object( xd( "フレッド", "シャム種", "シルバー" ) );
xd2 = New Object( xd, { "サム", "ジャーマンシェパード", "白黒" } );
Show( xa );
Show( xb );
Show( xc );
Show( xd );
Show( xd1 );
Show( xd2 );
xd2 = xd; // xdへの2番目の参照を戻す
xdclone = xd << Clone; // xdを新しいインスタンスにコピーし、xdcloneと名付ける
xd2:name = "ジェリー";
Show( xd:Get Pet Name(), xd2:Get Pet Name(), xdclone:Get Pet Name() );
この例は、Petクラスの複数のインスタンスを作成します。JSL関数Show()の出力は、Petクラス定義で定義されている_show_メソッドによって決まります。この例は、クラスインスタンスへのJSL参照をもう1つ作る場合とクラスインスタンスを複製する場合の違いも示します。Cloneメッセージを使った場合、元のクラスインスタンスから独立した、新しいインスタンスが作成されます。しかし、この新しいインスタンスは、元のインスタンスのコピーから作成されたものです。