lang
クラス定義
Tonyu2では,1つのファイルに1つのクラスを定義します.
- ファイル名は <<クラス名>>.tonyu という形式になります.
- 例えば,Hello.tonyu という名前のファイルは,Hello という名前のクラスを定義します.
- ファイル全体がクラス定義になります.クラスを定義するための構文(例えば,Javaの
class MyClass {... }
など)は不要です.
- ファイルには,次のいずれかを複数記述できます.
- 継承宣言
- 組み込み宣言
- native宣言
- mainメソッドの処理内容
- 非mainメソッドの定義
- 定義された(Tonyu2の)クラスは,Javascriptのいわゆる「クラス」(function+prototypeによるメソッド定義)として機能します.
継承宣言
このクラスの親クラスを設定します.ファイルの先頭に次のように宣言します
継承宣言の書式
extends 親クラス名;
- 継承宣言を省略すると,プロジェクト設定によって設定されている親クラスを自動的に継承します.
- 親クラス名 に
null
を設定すると,親クラスがないクラスになります.
- 継承は,JavaScriptの一般的な継承の方法(このクラスを表す関数オブジェクトのprototypeが,親クラスのオブジェクトになる)で行われます.
組み込み宣言
このクラスに組み込むクラス(モジュールクラス)を設定します.ファイルの先頭,または継承宣言続いて次のように宣言します
継承宣言の書式
includes モジュールクラス名[, モジュールクラス名...];
- このクラスでは,組み込んだモジュールクラスがもつメソッドを利用できます.
- 組み込みは継承とは異なり,複数のクラスを組み込むことができます
- モジュールクラスの実体は通常のクラスと同じ方法で作成します.
- モジュールクラスが他のモジュールクラスを組み込んでいる場合,組み込んだ先のクラスでもそれらのモジュールクラスのメソッドが組み込まれます.
- モジュールクラスが他のクラスを継承している場合,組み込んだ先のクラスもそのモジュールの親クラスを継承している必要があります.
- 組み込みは,モジュールクラスがもつメソッドの一覧を,このクラスの関数オブジェクトのprototypeオブジェクトに追記する方式で行われます.継承とは異なり,
instanceof
演算子によって検査されるオブジェクトのクラスが,特定のモジュールクラスを組み込んでいるかどうかは判定できません.
native宣言
native宣言は,Tonyu2のプログラムからJavascriptのネイティブオブジェクトにアクセスするために用います.ファイル中で次のように宣言します.
native宣言の書式
native 変数名;
- 指定された変数名を,このファイル中ではJavascriptのトップレベルスコープ(一般的にはwindowオブジェクト)に定義されている変数の値として扱います.
- 親クラスに書いてあるnative宣言は子クラスには適用されません.必要に応じて子クラスにも同じnative宣言を書く必要があります.
mainメソッドの処理内容
mainメソッドは,mainという名前をもつメソッドです.Actorクラスなどでは,オブジェクトが出現してから停止するまでの動作を記述するのに用いられます.
ファイルのトップレベル(メソッド定義に囲まれていない部分)に書かれた文はmainメソッドの内容として定義されます.
mainメソッドは引数を受け取ることはできません.
非mainメソッドの定義
名前がmainでないメソッドは非mainメソッドです.
ファイルのトップレベルにおいて次の形式で定義します.
リスト1 メソッド定義
function メソッド名(引数リスト) {
処理内容
}
※function の代わりに \ が使用可能です(拡張構文参照)
プロパティの定義
プロパティ(getter/setter)は次の書式で定義します
//getter
\プロパティ名 {
処理内容
}
//setter
\プロパティ名=値 {
処理内容
}
例
\myProp {
print("Get myProp="+_myp);
return _myp;
}
\myProp=value {
print("Set myProp to "+value);
_myp=value;
}
myProp=10; // Set myProp to 10
x=myProp; // Get myProp=10
変数の種類
- 引数
- 1つのメソッドに渡される値です.メソッド宣言の引数リストに記述されます.1回のメソッド呼び出しが終わると破棄されます.
- ローカル変数
- メソッド宣言の処理中でvar で宣言されます.1回のメソッド呼び出しが終わると破棄されます.
- グローバル変数
- 名前が$で始まる変数はグローバル変数です.すべてのTonyu2オブジェクトから直接参照できます.
- Javascriptからは
Tonyu.globals.グローバル変数名
で参照できます.
- クラス変数
- 現在のプロジェクトおよび標準ライブラリで定義されているクラス名と同じ名前の変数はクラス変数です.そのクラスをあらわす関数オブジェクトを参照します.
- Javascriptからは
Tonyu.classes.クラス変数名
で参照できます.
- native変数
- native宣言によって宣言された名前の変数です.Javascriptのトップレベルスコープにおける同名の変数を参照します.
- 束縛されたメソッド
- このオブジェクトがもつメソッドと同じ名前の変数で、後ろに引数リスト
()
を伴わない場合、この変数はこのオブジェクトに束縛されたメソッドになります。この値は関数オブジェクトであり、呼び出し方にかかわらずこのオブジェクトをthis
として呼び出します。
- 後ろに引数リストを伴う場合、束縛を行わず即時にこのオブジェクトの同名のメソッドを呼び出します。
- フィールド
- そのクラスのオブジェクトがもつ値です.上のどれにもあてはまらない変数はフィールドとして解釈されます.
- Javascriptではいわゆる
this.x
という形式で参照されるものです.Tonyu2でもこの方式でも参照できます.
例
リスト2 MyClass.tonyu
extends Actor;
native alert;
// main関数
x=3;
rate=5;
y=mult(x);
alert(y); // 15
// main関数終わり
\mult(a) {
var res=a*rate;
return res;
}
- クラス名はMyClass
- 親クラスはActor
- Javascriptの
alert
関数を利用する
x,rate,y
はフィールド
- multメソッドを定義
-
a
は引数,res
はローカル変数,rate
はフィールド
.