[转]ActionScript为什么不支持函数重载

照我的理解,函数重载(Function Override)从来不是面向对象语言的核心。因此,ActionScript语言是否支持函数重载不应该成为人们批评或质疑它的原因之一,是否实现函数重载完全取决于你的应用。
曾经遇到一个问题,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语言的内部设计实现有关。我们给出几个重要的概念,有助于理解上述问题。

posted @ 2011-04-14 23:28  Atypiape2  阅读(574)  评论(0编辑  收藏  举报