更新:你见过JavaScript支持重载吗,规范就是这么定义的。如果不是研究Java和Flex对象的Serialization,我也不会注意它。 距离写这篇文章已有8年了,时光匆匆啊,今天整理资料时看到它,就搜索了一下并在StackOverflow得到印证。


=====================以下是原文========================================

ActionScript与JavaScript类似,都是符合ECMAScript语言规范的语言。ActionScript 3.0更是向面向对象语言靠近了一大步。相对而言,JavaScript则在停留在基于对象的层次上(曾经看到一份资料,说Firefox对JavaScript的支持有一个时间表,大概到07年春季就能支持JavaScript2.0,目前也就是1.5左右)。

抛开ActionScript与JavaScript的版本不谈,让我们探讨一些以下几个问题: 
1.ActionScript 3.0 是面向对象的吗? 
2.ActionScript 3.0 为什么不支持函数重载

首先,官方对ActionScript3.0的描述如下: 
ActionScript 3.0 offers a robust programming model that will be familiar to developers with a basic knowledge of object-oriented programming.

Because of ActionScript's roots as a scripting language, ActionScript 3.0 OOP support is optional. This affords programmers flexibility in choosing the best approach for projects of varying scope and complexity. For small tasks, you may find that using ActionScript with a procedural programming paradigm is all you need. For larger projects, applying OOP principles can make your code easier to understand, maintain, and extend.

从上述叙述来看,ActionScript的确是支持面向对象语言的,但它不是作为一个面向对象语言来设计的。它源自脚本语言,并支持对象的概念。引入面向对象机制是为了克服脚本语言面对大型软件开发的重用、维护及扩展的难题。实际上,脱离应用和历史,谈论某种语言的面向对象机制的纯粹性毫无意义可言(就像论坛经常就C++或Java孰优孰劣论战一样毫无意义)。

其次,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语言的内部设计实现有关。我们给出几个重要的概念,有助于理解上述问题。

(一)函数也是对象 
ActionScript语言所谓的函数实际上也是对象(即Function),而且函数也是对象。函数可以依附于任何对象,它是自由的。而面向对象语言例如Java,函数是和类实例绑定在一起的(静态函数可以脱离类实例,但绑定于类,仍然不能自由访问)。

(二)对象是关联数组 
ActionScript语言的所谓对象,实际上是一个属性和函数关联数组。你可以定义一个类,包含若干属性和函数。例如上述PetStoreFacadeImpl类。假设它包含一个String类型的属性attribute,可以通过.操作符访问属性,如: 
PetStoreFacade facade = new PetStoreFacadeImpl(); 
var attr:String = facade.attribute;

访问函数,通过 facade.getAccount(username)调用函数。实际上,还可以这样: 
var attr:String = facade['attribute'];//数组 
facade['getAccount'].call(null,username) //数组 
或者 
facade['getAccount'].call(null,username,password) //数组

看来,属性和函数标识是作为其对象访问时的唯一主键,因此也就没办法直接支持编码式的函数重载了。 

转载于:https://www.cnblogs.com/draken/p/3781012.html

ActionScript语言函数重载相关推荐

  1. C++语言函数重载详解和示例

    C++ 函数重载的概念 在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同.例如把变量的值写入文件,变量的类型int.long.double.char,需要通过参数把变量传入函数.在 ...

  2. c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍

    对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...

  3. c 语言重载参数类型不同重载和,C++基础学习之函数重载的简单介绍

    前言 我们在平时写代码中会用到几个函数但是他们的实现功能相同,但是有些细节却不同.例如:交换两个数的值其中包括(int, float,char,double)这些个类型.在C语言中我们是利用不同的函数 ...

  4. C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))

    1. C++关键字(C++98) 2. 命名空间 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用 域中,可能会导致很多冲突.使用命名空间的目的是对 ...

  5. C语言学习篇(32)——为什么C语言不能函数重载

    前言 在日常的开发中,我们有时会遇到根据不同情景,想通过传入不同类型的参数,而调用统一的函数接口,即函数重载. 在C++中原生支持了函数重载, 而在C语言中并不支持,只能通过一些技巧来变相解决, 如定 ...

  6. c语言函数参数缺省,C++缺省参数和函数重载

    参数的缺省值 在C++中参数可以设置缺省值,设置了缺省值之后,这个参数在调用时可以省略. 注意:设置缺省值的参数只能是最后的几个参数.也就是说某一个参数一旦设置了缺省值,其后而的参数也必须设置缺省值. ...

  7. c语言如何实现函数修改,c语言如何实现函数重载

    Question: c语言如何实现函数重载 Background:c语言中不允许有同名函数,因为编译时函数命名是一样的,不像c++会添加参数类型和返回类型作为函数编译后的名称,进而实现重载. Meth ...

  8. c++ 函数 -函数重载 -特殊用途的语言特性(默认实参,内联函数 ,constexpr ,assert,NDEBUG)

    c++ 函数 -函数重载 -特殊用途的语言特性 文章目录 c++ 函数 -函数重载 -特殊用途的语言特性 函数重载 定义: 重载和const形参 const_cast 和重载 const_cast 重 ...

  9. 从C语言出发新角度内核剖析C++函数重载(千字精品,附带大厂面试问题回答)

    目录 C角度引入: 函数重载: 1. 什么是函数重载: 2.函数重载的优点: 3.函数重载的特性: 剖析函数重载: 最后做一个小补充(大厂面试题): C角度引入: 首先在进行C++讲解之前我们照例先来 ...

最新文章

  1. Verilog系统函数(一) $display
  2. Nginx配置——搭建 Nginx 高可用集群(双机热备)
  3. SQL Server-聚焦深入理解动态SQL查询(三十二)
  4. boost::gil::channel_view用法的测试程序
  5. Entity Framework 6以Code First方式搭建Sqlite数据库环境
  6. linux 查看可执行文件动态链接库相关信息(转)
  7. GlassFish 4带来了Java EE 7
  8. 【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)
  9. phpstudy能安装不带mysql的么_装了phpstudy还需要装mysql吗
  10. RabbitMQ多消费者消息分配
  11. String类的流程控制
  12. 天使轮融资一个亿的AI公司创新奇智,与徐工信息达成战略合作
  13. Python算法:推导、递归和规约
  14. OpenCV threshold 二值化
  15. 再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
  16. Library弱依赖打包
  17. 软件测试组长要做的事情,测试组长的工作计划(共10篇).docx
  18. 60分钟教你上手PyTorch + 迁移学习
  19. kubeadm修改证书有效期
  20. 测试 CS4344 立体声DA转换器

热门文章

  1. 搜狗 2018校招 商业基础工程—测试开发练习题
  2. AMBER“FATAL: Atom .R<SEP 552>.A<N 1> does not have a type.“
  3. 水下图像增强算法研究
  4. 高级计算机网络教程,计算机网络高级教程
  5. 【复杂网络学习笔记】1:基本知识和小世界网络初步建立
  6. 【OpenCV 例程300篇】40. 图像分段线性灰度变换
  7. 前端面试题型汇总(适合应届/社招1年水平)
  8. 小型数据库系统开发作业
  9. Rviz中控制机器人模型运动(arbotix)
  10. xmanager linux 远程桌面,Windows系统下通过xmanager远程桌面控制Linux