OverloadSupport?クラス
- AS3でオーバーロードを実現するためのユーティリティクラスです。
- ネームスペースを使います。
コード
サンプル
- http://snippets.libspark.org/svn/as3/OverloadSupport/tests/org/libspark/utils/overload/OverloadSupportTest.asにあります。
- AS3Unitによるテストで、クラスHogeが使い方のサンプルです。
- リポジトリブラウザで閲覧
どんな風になるのか
次のようなコードで、オーバーロードが出来るようになります。
import org.libspark.utils.overload.OverloadSupport;
use namespace overloadDefault;
use namespace overloadStringString;
use namespace overloadStringInt;
public class Hoge
{
public function func(...args):void
{
OverloadSupport.invoke(this, 'func', args);
}
overloadDefault function func():void
{
trace('Default');
}
overloadStringString function func(a:String, b:String):void
{
trace('StringString', a, b);
}
overloadStringInt function func(a:String, b:int):void
{
trace('StringInt', a, b);
}
}
ネームスペースを使って、同名のメソッド(ここではfunc)をいくつか定義しています。
ここで、
hoge.func('aaaa', 'bbb');
とすると、引数の型がStringとStringな
overloadStringString function func(a:String, b:String):void
{
trace('StringString', a, b);
}
のメソッドが呼び出され、
hoge.func('str', 1024);
とすると、引数の型がStringとintな
overloadStringInt function func(a:String, b:int):void
{
trace('StringInt', a, b);
}
が呼び出され、
hoge.func();
とすると、引数無しな
overloadDefault function func():void
{
trace('Default');
}
が呼び出されます。
使い方
1. ネームスペースの定義
予め、オーバーロード用のネームスペースを作ります。名前は何でもいいですが、型を列挙しておくと分かりやすいかもしれません。
クラスと同じように、asファイルでpublicに宣言しておくと便利です。
overloadStringString.as
package
{
public namespace overloadStringString;
}
overloadStringInt.as
package
{
public namespace overloadStringInt;
}
2. ネームスペースと型の関連付け
次に、先程作ったネームスペースと型を関連付けます。以下のようなコードを、最初に実行されるクラス(ドキュメントクラス)のコンストラクタなどに記述してください。
import org.libspark.utils.overload.OverloadSupport; OverloadSupport.register(overloadStringString, String, String); OverloadSupport.register(overloadStringInt, String, int);
OverloadSupport?.registerメソッドに、ネームスペースと、そのネームスペースに関連付ける型を必要なだけ書きます。こうすることで、引数の型に応じて、そのネームスペースのメソッドが呼ばれるようになります。
ちなみに、引数無しの場合に使う「overloadDefault」ネームスペースは、予め「org.libspark.utils.overload.overloadDefault」に定義されているので、登録する必要はありません。
3. オーバーロードメソッドの定義
いよいよメソッドを定義します。まずはじめに、使用するネームスペースをimportし、useすることを忘れないで下さい。
use namespace overloadDefault; use namespace overloadStringString; use namespace overloadStringInt;
次に、このネームスペースを使って、先程関連付けた型と同じ引数のメソッドを定義します。メソッド名は全て同じにしてください。
overloadStringString function func(a:String, b:String):void
{
trace('StringString', a, b);
}
overloadStringInt function func(a:String, b:int):void
{
trace('StringInt', a, b);
}
overloadDefault function func():void
{
trace('Default');
}
3. publicメソッドの定義
最後に、またまた同じメソッド名で、publicメソッドを定義します。このメソッド内では、OverloadSupport?.invokeメソッドを呼び出してください。
public function func(...args):void
{
OverloadSupport.invoke(this, 'func', args);
}
メソッドの引数は可変引数「...args」にし、OverloadSupport?.invokeの第1引数にthis、第2引数にメソッド名、第3引数にargsを渡してください。
これで無事、オーバーロードが実現できます。
