AS 函数重载

发表评论 阅读评论

C++里有很多好用的特性,比如函数重载:
函数重载:同一个函数名,根据不同的参数列表来调用不同的函数。
不同的参数列表:不同是参数个数,不同的参数类型,或者参数类型顺序不同。 跟函数返回类型没关系。
当然函数重载也包括构造函数重载。
有关更详细的函数重载请看这里
至于AS的函数重载请看下面。

AS并没有像C++一样提供语言级的支持,但是AS里有个关键字... (rest)
... (rest) 指定函数将接受任意数目的用逗号分隔的参数。
OK,有了它,我们可以模拟函数重载。

我们自己先规定好,可接受的参数列表,然后去做相应的处理。

  • 好处使用者只需使用一个函数名即可实现不同的功能,当然这些功能应该都是相近的
  • 坏处:没有了编译时错误,使因手写出错的几率增加

如果上面的没怎么明白,请看下面的代码,看了之后相信你就会明白,然后说:“哦,原来是这样啊,AS真的很强大! :lol: ”

package  
{
    import flash.display.Sprite;
    /**
     * www.litefeel.com
     * @author lite3
     */
    public class Test extends Sprite
    {

        public function Test() 
        {
            var sumer:Sumer = new Sumer();
            // 添加一个数字
            sumer.add(1);
            // 添加一个字符串类型的数字
            sumer.add("1");
            // 添加一个数字列表
            sumer.add([1, 2, 3]);
            // 添加两个数值之间的所有数字
            sumer.add(1, 5);
            // 添加一个错误的参数列表
            //sumer.add(1, 2, 3);
        }
    }
}

class Sumer
{
    /**
     * 增加数值
     * 
     * ------------------------------------
     * 增加一个数字 
     * function addNumber(num:Number):void;
     * @param   num 要增加的数字
     * ------------------------------------
     * 增加一个字符串形式的数字 
     * function addString(num:String):void;
     * @param   num 要增加的数字的字符串
     * ------------------------------------
     * 增加一个数组里的所有元素
     * function addList(list:Array):void;
     * @param   list
     * ------------------------------------
     * 增加两个数值之间的所有数字
     * function addAllBetween(beginNum:Number, endNum:Number):void;
     * @param   beginNum    开始数字
     * @param   endNum      结束数字
     */
    public function add(... arg):void
    {
        // 判断是否没有匹配的参数列表
        var hasErr:Boolean = false;

        // 区别不同的参数个数,只有一个参数
        if (1 == arg.length)
        {
            // 符合 addNumber 的参数列表
            if (arg[0] is Number)
            {
                addNumber(arg[0]);
            }
            // 符合 addString 的参数列表
            else if (arg[0] is String)
            {
                addString(arg[0]);
            }
            // 符合 addList 的参数列表
            else if (arg[0] is Array)
            {
                addList(arg[0]);
            }
            // 没有符合一个参数的参数列表
            else
            {
                hasErr = true;
            }
        }
        // 有两个参数
        else if (2 == arg.length)
        {
            // 符合 addAllBetween的参数列表
            if ((arg[0] is Number) && (arg[1] is Number))
            {
                addAllBetween(arg[0], arg[1]);
            }
            // 没有符合两个参数的参数列表
            else
            {
                hasErr = true;
            }
        }
        // 没有符合其他个数的参数列表
        else
        {
            hasErr = true;
        }

        // 纠错
        if (hasErr) throw new ArgumentError("参数列表不正确!");
    }

    private function addNumber(num:Number):void 
    { 
        trace("addNumber:  num = ", num);
    }
    private function addString(num:String):void
    {
        trace("addString:  num = ", num);
    }
    private function addList(list:Array):void
    {
        trace("addList:  list = ", list);
    }
    private function addAllBetween(beginNum:Number, endNum:Number):void
    {
        trace("addAllBetween:  beginNum = ", beginNum, "   endNum = ", endNum);
    }
}

运行结果:

addNumber:  num =  1
addString:  num =  1
addList:  list =  1,2,3
addAllBetween:  beginNum =  1     endNum =  5
标签: ,

  1. lite3 | | #1

    @Jing
    switch 也Ok的, switch嵌套也不好看的,O(∩_∩)O~ :razz:

  2. Jing | | #2

    建议使用switch

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部