`
陈新杰
  • 浏览: 107351 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

对ActionScript语言函数重载的理解

    博客分类:
  • flex
阅读更多

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

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

分享到:
评论

相关推荐

    ActionScript3.0中文语言参考chm版

    ActionScript3.0(简称AS3)是Adobe Flash平台的核心编程语言,用于创建富互联网应用程序(RIA)、游戏...这个中文语言参考将帮助你理解和应用AS3的各个方面,无论你是初学者还是经验丰富的开发者,都会从中受益匪浅。

    ActionScript 3.0 CookBook 中文翻译

    4. 函数和方法:掌握函数的定义、参数传递、返回值以及方法的重载。 5. 事件处理:了解ActionScript 3.0的事件模型,如何监听和响应用户交互或程序状态变化。 6. 显示对象和舞台:学习如何创建和操作DisplayObject,...

    ActionScript3.0完全自学手册电子教案_ActionScript3.0_

    9. **高级特性**:深入研究AS3.0的高级特性,如函数重载、静态与动态属性、元数据、类型转换等。 10. **实践项目**:通过实际项目练习,将所学知识应用于实际,如创建互动游戏、数据可视化应用或移动应用。 总之,...

    actionscript3.0中文教程

    ActionScript 3.0 是Adobe开发的一种面向对象的编程语言,主要用于创建富互联网应用程序(RIA),尤其是Flash平台上的交互式内容。本教程旨在帮助你深入理解ActionScript 3.0的核心概念、语法特性以及实际应用。 一...

    ActionScript 3.0 编程(PDF)

    AS3.0 支持函数重载,即多个同名函数但参数列表不同。 二、面向对象编程 1. 类与对象:AS3.0 是一种完全的面向对象语言,支持类的定义、继承、封装和多态。通过 `class` 关键字定义类,使用 `new` 关键字实例化...

    ActionScript 3.0开发编程手册中文

    函数也是类的一部分,支持重载,可以根据参数的数量和类型来定义多个同名函数。 二、类与对象 AS3的核心是类和对象。类是创建对象的模板,定义了属性和方法。例如,MovieClip类用于处理动画,Button类用于创建交互...

    flex 3.0 actionscript 2.0

    AS2.0引入了类和对象的概念,增强了面向对象的编程能力,支持命名空间和函数重载。 4. **Flex Component Kit**:Flex 3.0 提供了一套丰富的预建组件库,如按钮、文本框、面板等,方便快速构建用户界面。开发者可以...

    ActionScript 3.0 编程(中文版)

    8. 布尔运算符重载:AS3.0允许对布尔值进行重载,提供了一种更灵活的逻辑控制方式。 9. 内建类型:AS3.0引入了如int、uint、Number、String等基本数据类型,它们都有自己的特定功能和限制。 10. 显式null:在AS3.0...

    ActionScript高级组件开发

    ActionScript作为Flex的核心编程语言之一,提供了丰富的API支持开发者创建复杂而灵活的用户界面组件。本文将详细介绍如何使用ActionScript语言进行高级组件的开发。 #### 二、创建高级组件 ##### 1. 关于创建高级...

    十二个非常有用的Flex函数Source In Flex

    该函数用于在当前浏览器窗口中执行页面重载操作。使用JavaScript的`location.reload()`方法来触发页面刷新。 **示例代码**: ```actionscript navigateToURL(new URLRequest("javascript:location.reload();"), "_...

    ActionScript 3.0编译器编译错误大全

    在深入探讨《ActionScript 3.0编译器编译错误大全》这一主题之前,我们首先需要理解ActionScript 3.0(AS3)的基本概念及其在Flash开发中的重要性。ActionScript是一种强大的面向对象编程语言,用于创建交互式内容、...

    ActionScript3.0详解

    9. **更强大的函数参数**:AS3支持默认参数值、可变参数列表和函数重载,使函数调用更灵活。 10. **DisplayObject容器**:AS3的显示对象层次结构允许开发者创建复杂的图形和动画,如MovieClip、Sprite、Shape等。 ...

    actionscript高级组件开发

    为了创建高级可视化组件,开发者需要实现一个构造函数(constructor),并可能需要重载`UIComponent`类中的某些受保护的方法。这些方法包括但不限于: 1. **`commitProperties()`**:此方法用于提交组件的所有属性...

    用ActionScript_开发高级可视化组件#.pdf

    ActionScript是一种强大的脚本语言,主要用于Adobe Flex的应用程序开发。通过ActionScript,开发者能够构建高度定制化的用户界面组件,从而增强应用程序的功能性和用户体验。本文档将详细介绍如何使用ActionScript...

    用ActionScript开发高级可视化组件

    为了创建一个高级的可视化组件,我们需要实现组件的构造函数,并可能需要重载`UIComponent`类的一些受保护的方法。这些方法包括但不限于: - **`commitProperties()`**:用于提交组件的所有属性变化。该方法确保...

    AS3 入门学习资料和提升资料整理大全

    函数重载允许你为同一个函数名提供不同的参数列表,而匿名函数则可以在不定义名称的情况下使用函数,通常用作回调或立即执行的代码块。AS3还引入了强类型系统,这意味着在编译时需要声明变量的数据类型,这有助于...

    action3.0电子书

    函数和方法也变得更加灵活,支持重载和默认参数。 其次,面向对象编程是ActionScript 3.0的另一个核心主题。书中会详细讲解类、对象、继承、封装和多态等基本概念。通过实例,读者可以学习如何创建自定义类,如何...

Global site tag (gtag.js) - Google Analytics