OverloadSupport?クラス

  • AS3でオーバーロードを実現するためのユーティリティクラスです。
  • ネームスペースを使います。

コード

サンプル

どんな風になるのか

次のようなコードで、オーバーロードが出来るようになります。

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を渡してください。

これで無事、オーバーロードが実現できます。