作者相關(guān),轉(zhuǎn)載請保留:http://as3blog.com/as3/as3tip-oop/
本文是我(aw)在整理了相關(guān)文檔和討論之后,結(jié)合自己的親自實驗總結(jié)出來的一些經(jīng)驗和心得。我盡量描述詳盡,避免模糊概念,當然也希望所有看官提出批評意見。為了表述方便,其中術(shù)語不限定語言,如我可能會一會兒用class,一會兒用類。
面向?qū)ο蟮碾y點部分就是理解變量作用域修飾符(modifier)其實也就是面向?qū)ο笾形覀円呀?jīng)熟悉的public、protected、private等等。本文還深入討論了ActionScript3中新增的internal 等概念。下面我依次列出:
一、關(guān)于package以及internal package,用“形而上學”的方式理解,就是物理目錄下的類集合。在AS2中只需要保證文件系統(tǒng)的路徑匹配,然后用類似“import com.awflasher.someUtils”的方法導入即可。而AS3則要求您在所有的類中聲明package關(guān)鍵詞。package的大括號對 “{}”內(nèi),我們只能定義一個類,我們可以在這個大括號外面定義一些輔助類,不過這些類只能被當前這個類(你在package大括號對內(nèi)定義的類)訪問。當然,一個package大括號對內(nèi)只有一個類,這并不代表一個package內(nèi)只有一個類。你可以在同一目錄下定義多個屬于該package(指代這個目錄)的類。它的意義絕不是簡單的“類文件集合容器”,而是一個讓各種應(yīng)該協(xié)同工作的類集中到一起的項目包。值得一提的是,所謂“協(xié)同工作”是指至少有一個class要引入其他一些class 來進行功能設(shè)計,而這時候采用internal修飾可以省去很多getters和setters。我自己回憶起在湖南衛(wèi)視的項目中用AS2開發(fā)的 Vplayer,兩個類AVCore和AVControl就有很多getter和setter,搞的特別麻煩。
internal類似public,但限定在一個 package內(nèi)了。在同一個package 內(nèi)的類可以訪問同一個package 內(nèi)其他類的internal 變量,而其他包內(nèi)的類無法訪問。 package 與類的繼承性毫無關(guān)系,比如TextField 和Sprite、MovieClip 都繼承自DisplayObject 類,但TextField屬于 flash.text包,而MovieClip和Sprite 屬于flahs.display 包。也就是說,包對類的限定是與繼承鏈毫無關(guān)聯(lián)的、一個新的 “維度”的限定。
附:使用一個類的時候,我們必須import這個類,或者包含這個類的package。AS2時直接寫完整包路徑的使用方法在AS3中不管用了,本文后面有詳細介紹。
二、關(guān)于public public定義的類或者屬性可以在任何作用域內(nèi)由任何來源訪問。構(gòu)造函數(shù)永遠都是public的,F(xiàn)lex中的應(yīng)用程序類(Application Class)和Flash CS3中的文檔類(Document Class)必須是public的。且不能缺省public這個關(guān)鍵詞聲明。我在測試中發(fā)現(xiàn),如果不聲明public,F(xiàn)lash根本就不會獲取類的定義,進而編譯無法通過。
三、關(guān)于protected protected聲明類似AS2的private,它定義的屬性只能在自己子類中可見,而其它場合都是不可見的。這一點與Java等傳統(tǒng)OOP語言類似。
四、關(guān)于private 注意AS3的private和AS2的private大不相同,它定義的屬性只屬于自己,子類可以定義毫無牽連的同名屬性。 dynamic 和原來AS2的dynamic一樣,用dynamic聲明的類可以動態(tài)的加入屬性。這些屬性也可以通過delete來刪除。動態(tài)加入的屬性一旦被切斷所有的引用就會被垃圾回收機制自動回收。有時候用System.totalMemory檢測不到內(nèi)存釋放是因為垃圾回收機制并不是即時運行的。
五、關(guān)于dynamic 動態(tài)(dynamic)類允許在運行時動態(tài)地添加屬性,常見的動態(tài)類有MovieClip和頂級(top-level)的Array。如果您的自定義類要繼承于動態(tài)類,那么請也定義為動態(tài)的,不要省略dynamic關(guān)鍵詞。
六、關(guān)于繼承(extends)和override 繼承其實并不太復雜,唯一要說明的就是:子類的構(gòu)造函數(shù)一定要用“super”調(diào)用一次父類的構(gòu)造函數(shù),否則報錯!對于繼承后的子類,如果要重新定義父類的非private方法,必須使用override關(guān)鍵詞。在override的時候,如果我們需要調(diào)用父類的方法,可以使用super關(guān)鍵詞(由于繼承方法在邏輯上與父類往往有相似性,因此沒有必要把方法邏輯完全重寫)官方幫助中的這個例子非常易懂: package { import flash.display.MovieClip; public class SuperExample extends MovieClip { public function SuperExample() { var myExt:Extender = new Extender() trace(myExt.thanks()); // output: Mahalo nui loa } } }
class Base { public function thanks():String { return “Mahalo”; } }
class Extender extends Base { override public function thanks():String { return super.thanks() + ” nui loa”; } }
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2743937-1-3.html
出處:藍色理想
責任編輯:elesa
上一頁 下一頁 AS3的面向?qū)ο筇攸c概述 [2]
◎進入論壇Flash專欄版塊參加討論
|