actionscript3.0 函数重载问题

本文探讨了ActionScript 3.0作为一种脚本语言如何支持面向对象编程,以及为何没有直接支持函数重载特性。文章还提供了一个通过参数检查实现重载效果的示例。

ActionScript语言函数重载

关键字:       

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) //数组

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

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值