* 構文 [#l789f3fc] #contents * 構文 [#l789f3fc] ** class [#zbe0b959] - public,protected,privateは無し。 - 継承もなし。 - コンストラクタ,デストラクタは有り。 - operatorは可能?(未確認) ** import [#tf87bcd5] 他のmoduleの''関数''(Typeは不可)を自分のmodule内で使うための機能。 なので,一工夫したほうがいいかも。 その一例。 実装クラス(L_MathVector3)はIObjectを必ず継承する。 外部に公開する関数(F_MathVector3_*)はクラス外に宣言し,引数の先頭に必ずIObjectをとる。 他のモジュールは,公開されたその関数を通してアクセスするか,そのラッパークラス(MathVector3)を使ってアクセスする。 :C++コード| #code(c,){{ // IObject型を追加。 engine->RegisterInterface("IObject"); }} :Vector3_Local.as| こいつは,mathモジュールでのみコンパイルされる。 クラスの内部実装を記述している。 #code(c,){{ // module math - local class L_MathVector3 : IObject { L_MathVector3(){ /* */ } float mX; float mY; float mZ; float& x() { return mX; } void normalize() { //... } }; IObject@ F_MathVector3_Constructor() { MathVector3 obj; return @obj; } float& F_MathVector3_x( const IObject@ in obj ) { return cast<L_Vector3>(obj).mX; } void F_MathVector3_normalize( IObject@ obj ) { cast<L_Vector3>(obj).normalize(); } }} :Vector3.as| こいつは,他のmoduleでコンパイルされる。 クラスの内部実装は書かず,内部実装が書かれている関数を呼ぶだけに留める。 #code(c,){{ // module public import IObject@ F_MathVector3_Constructor() from "math"; import float& F_MathVector3_x( const IObject& in ) from "math"; import void F_MathVector3_normalize( const IObject& in ) from "math"; class MathVector3 { MathVector3() { mObj = F_MathVector3_Constructor(); } IObject@ mObj; float& x() { return F_MathVector3_x( mObj ); } void normalize() { F_MathVector3_normalize( mObj ); } }; }} |