曾经遇到一个问题,Java语言的某个类接口要映射要ActionScript类,由于该类的接口有函数重载的现象,导致ActionScript无法声明相应的接口。例如:
//Java类 interface PetStoreFacade{ Account getAccount(String username); Account getAccount(String username, String password); //... }
//ActionScript类 interface PetStoreFacade{ function getAccount(username:String):Account; function getAccount(username:String, password:String):Account; //ERROR,ActionScript不支持 }
从此例,大家可以看出,讨论ActionScript是否支持函数重载的来源了(这大概是其中之一,即与支持函数重载的语言配合工作,或者要从支持函数重载的语言迁移到ActionScript就可能会遇到函数重载的问题)。
关于ActionScript支持函数重载的文章很多,通过ActionScript提供的语言机制和变通的手法,可以让ActionScript支持函数重载。示例如下:
class PetStoreFacadeImpl{ function getAccount(obj:*):Account { if(arguments.length==1) { if(arguments[0] typeof 'String') { //do getAccount(username:String) } } else if(arguments.length==2) { if(arguments[0] typeof 'String' && arguments[1] typeof 'String'){ //do getAccount(username:String,password:String) } } } }
通过arguments的判断比较,实现了函数重载,只需调用时传入合适的参数即可。不过我们仍然要问,为什么ActionScript不能直接支持函数重载。语言内部的实现机制是怎么样的?仔细查阅了一些资料之后,发现这个问题其实很简单。原来,这跟ActionScript语言的内部设计实现有关。我们给出几个重要的概念,有助于理解上述问题。