ActionScript語言函數(shù)重載

          關(guān)鍵字: ? ????

          ActionScript與JavaScript類似,都是符合ECMAScript語言規(guī)范的語言。ActionScript 3.0更是向面向?qū)ο?/b>語言靠近了一大步。相對而言,JavaScript則在停留在基于對象的層次上(曾經(jīng)看到一份資料,說Firefox對JavaScript的支持有一個(gè)時(shí)間表,大概到07年春季就能支持JavaScript2.0,目前也就是1.5左右)。

          拋開ActionScript與JavaScript的版本不談,讓我們探討一些以下幾個(gè)問題:
          1.ActionScript 3.0 是面向?qū)ο?/b>的嗎?
          2.ActionScript 3.0 為什么不支持函數(shù)重載

          首先,官方對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的確是支持面向?qū)ο笳Z言的,但它不是作為一個(gè)面向?qū)ο笳Z言來設(shè)計(jì)的。它源自腳本語言,并支持對象的概念。引入面向?qū)ο髾C(jī)制是為了克服腳本語言面對大型軟件開發(fā)的重用、維護(hù)及擴(kuò)展的難題。實(shí)際上,脫離應(yīng)用和歷史,談?wù)撃撤N語言的面向?qū)ο髾C(jī)制的純粹性毫無意義可言(就像論壇經(jīng)常就C++或Java孰優(yōu)孰劣論戰(zhàn)一樣毫無意義)。

          其次,ActionScript語言為什么不支持函數(shù)重載。

          照我的理解,函數(shù)重載(Function Override)從來不是面向?qū)ο笳Z言的核心。因此,ActionScript語言是否支持函數(shù)重載不應(yīng)該成為人們批評或質(zhì)疑它的原因之一,是否實(shí)現(xiàn)函數(shù)重載完全取決于你的應(yīng)用。

          曾經(jīng)遇到一個(gè)問題,Java語言的某個(gè)類接口要映射要ActionScript類,由于該類的接口有函數(shù)重載的現(xiàn)象,導(dǎo)致ActionScript無法聲明相應(yīng)的接口。例如:
          //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是否支持函數(shù)重載的來源了(這大概是其中之一,即與支持函數(shù)重載的語言配合工作,或者要從支持函數(shù)重載的語言遷移到ActionScript就可能會(huì)遇到函數(shù)重載的問題)。

          關(guān)于ActionScript支持函數(shù)重載的文章很多,通過ActionScript提供的語言機(jī)制和變通的手法,可以讓ActionScript支持函數(shù)重載。示例如下:

          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的判斷比較,實(shí)現(xiàn)了函數(shù)重載,只需調(diào)用時(shí)傳入合適的參數(shù)即可。不過我們?nèi)匀灰獑枺瑸槭裁碅ctionScript不能直接支持函數(shù)重載。語言內(nèi)部的實(shí)現(xiàn)機(jī)制是怎么樣的?仔細(xì)查閱了一些資料之后,發(fā)現(xiàn)這個(gè)問題其實(shí)很簡單。原來,這跟ActionScript語言的內(nèi)部設(shè)計(jì)實(shí)現(xiàn)有關(guān)。我們給出幾個(gè)重要的概念,有助于理解上述問題。

          (一)函數(shù)也是對象
          ActionScript語言所謂的函數(shù)實(shí)際上也是對象(即Function),而且函數(shù)也是對象。函數(shù)可以依附于任何對象,它是自由的。而面向?qū)ο笳Z言例如Java,函數(shù)是和類實(shí)例綁定在一起的(靜態(tài)函數(shù)可以脫離類實(shí)例,但綁定于類,仍然不能自由訪問)。

          (二)對象是關(guān)聯(lián)數(shù)組
          ActionScript語言的所謂對象,實(shí)際上是一個(gè)屬性和函數(shù)關(guān)聯(lián)數(shù)組。你可以定義一個(gè)類,包含若干屬性和函數(shù)。例如上述PetStoreFacadeImpl類。假設(shè)它包含一個(gè)String類型的屬性attribute,可以通過.操作符訪問屬性,如:
          PetStoreFacade facade = new PetStoreFacadeImpl();
          var attr:String = facade.attribute;

          訪問函數(shù),通過 facade.getAccount(username)調(diào)用函數(shù)。實(shí)際上,還可以這樣:
          var attr:String = facade['attribute'];//數(shù)組
          facade['getAccount'].call(null,username) //數(shù)組
          或者
          facade['getAccount'].call(null,username,password) //數(shù)組

          看來,屬性和函數(shù)標(biāo)識(shí)是作為其對象訪問時(shí)的唯一主鍵,因此也就沒辦法直接支持編碼式的函數(shù)重載了。

          posted on 2006-11-08 10:10 leoli 閱讀(968) 評論(0)  編輯  收藏 所屬分類: Flex

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案(17)

          文章分類(86)

          收藏夾(3)

          flex blog

          good site

          java blog

          my friend

          tools

          抓蝦

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 西宁市| 东山县| 巫山县| 莱州市| 韶关市| 吉水县| 左权县| 沈丘县| 多伦县| 鄂托克前旗| 周宁县| 景东| 沅江市| 昭通市| 曲阳县| 鞍山市| 洛阳市| 石城县| 衡阳市| 进贤县| 新野县| 平湖市| 莱西市| 敖汉旗| 海兴县| 鄯善县| 黔江区| 鄱阳县| 景宁| 隆安县| 突泉县| 秭归县| 手机| 咸宁市| 成安县| 蓬安县| 阿克| 北辰区| 洛宁县| 泸西县| 兴海县|