首页 > AS > AS 函数重载

AS 函数重载

2009年10月9日 发表评论 阅读评论

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

至于AS的函数重载请看下面。 :roll:

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

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

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

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

package  
{
	import flash.display.Sprite;
	/**
	 * www.lite3.cn
	 * <a herf="http://www.lite3.cn">www.lite3.cn</a>
	 * @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
分类: AS 标签: ,
  1. 2009年10月29日18:15 | #1

    建议使用switch

  2. 2009年10月29日18:16 | #2

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

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
有话直说(用户名,邮箱只需填写一次,然后保存到cookie里,第二次将不必重新填写)