天天看點

揭開AS程式的外紗(十) -- 類的一些常用用法

<b>      一、類的繼承</b>

<b>      </b>類的繼承是類的一個重要用法。使用繼承,我們可以重複利用基類中的代碼,而不必重寫代碼。我們可以繼承AS自帶的類,如event等,也可以繼承我們自定義的類。

<b>      </b>下面,我們将寫一個新的as腳本,繼承上篇的circle.as。

<b>      </b>(1) 我們在area檔案夾下,建立一個名為square.as的as檔案,填入代碼如下:

<b>      </b>package area {

<b>      </b><b>      </b>public class square extends circle {

<b>      </b><b>      </b><b>      </b>public function info() {

<b>      </b><b>      </b><b>      </b><b>      </b>trace("類的繼承");

<b>      </b><b>      </b><b>      </b>}

<b>      </b><b>      </b>}

<b>      </b>}

<b>      </b>(2) 我們回到上層目錄,打開new.fla檔案,修改代碼如下:

<b>      </b>var s:square = new square();

<b>      </b>trace(s.getarea()); //輸出:基類中圓的面積

<b>      </b>trace(s.info()); //輸出:子類中info函數的trace語句

<b>      </b>繼承類使用的是extends方法,參見示例。由示例可見,繼承的兩個最大作用為:1.使用基類的代碼。2.新增自己的代碼。

<b>      </b><b>二、覆寫“基類的方法”</b>

<b>      </b>如上例,我們繼承了類後,希望輸出的面積是新的面積公式,并且還是想使用getarea()方法,但該方法已經被占用,怎麼辦?沒關系,我們可以覆寫基類的該方法。我們修改square.as的代碼如下:

<b>      </b><b>      </b><b>      </b>private var side:uint = 5;

<b>      </b><b>      </b><b>      </b>override public function getarea() {

<b>      </b><b>      </b><b>      </b><b>      </b>return side * side;

<b>      </b>打開new.fla,運作如下代碼:

<b>      </b>var c:circle = new circle();

<b>      </b>trace(c.getarea()); //輸出:圓的面積

<b>      </b>trace(s.getarea()); //輸出:正方形面積

<b>      </b>覆寫類使用的是override方法,參見示例。但是在覆寫類的時候,有以下幾點限制:

<b>      </b>(1) 覆寫方法和基類方法的控制權限必須相同

<b>      </b>(2) 覆寫方法和基類方法傳遞的參數數量和參數類型必須相同(參數名稱可以不同)

<b>      </b>(3) 覆寫方法和基類方法傳回值的資料類型必須相同

<b>      </b><b>三、get和set存儲器方法</b>

<b>      </b>讓我們先來看兩個例子:

<b>      </b>例1:

<b>      </b>public class circle {

<b>      </b><b>      </b>public var _msg:String = "測試字元串";

<b>      </b>例2:

<b>      </b><b>      </b>private var msg:String = "測試字元串";

<b>      </b><b>      </b>public function get _msg():String { //get存儲器

<b>      </b><b>      </b><b>      </b>return msg;

<b>      </b><b>      </b>public function set _msg(str:String):void { //set存儲器

<b>      </b><b>      </b><b>      </b>msg = str;

<b>      </b>例1在類體内定義了一個public的string變量。

<b>      </b>例2在類體内定義了一個private的string變量,然後通過get存儲器控制變量值的讀取,用set存儲器控制變量值的修改。

<b>      </b>然後我們在Fla檔案中,均可以運作以下語句:

<b>      </b>trace(c._msg);

<b>      </b>c._msg = "新的字元串";

<b>      </b>可以看到,兩者的效果是相同的。

<b>     </b>

<b>      </b>既然這樣,為什麼還要使用get和set存儲器呢?他們的作用是什麼呢?

<b>      </b>(1) 使用例1,我們必須同時開放讀權限和寫權限。而使用get和set存儲器,我們可以實作有選擇的開放讀權限和寫權限。

<b>      </b>(2) 我們可以在get和set存儲器中添加語句,在不改變變量本身的同時做一些處理。

<b>      </b>比如:return (msg+5),類似這樣的語句。

<b>      </b>(3) 擴充子類的時候,例1方式中的_msg是不可以被覆寫的(隻能覆寫方法),但例2中,可以覆寫get和set存儲器。

      如果你不需要用到上面這3種情況,那麼我建議還是用例1的方式來實作。簡潔多了,還不容易出錯!

<b>      </b><b>四、嵌入資源類</b>

<b>      </b>有時候我們可能會需要往Flash檔案裡嵌入一些資源,如MP3、視訊、圖像、字型等。嵌入資源的好處是,可以確定當需要的時候立即能用。缺點是,會增加生成的swf檔案大小(因為是把資源直接放入到生成的swf檔案裡了)。

      什麼樣的資源适合嵌入呢?我的建議是,檔案體積不大,但使用頻繁,或者對使用的即時性要求比較高的資源,可以考慮嵌入。比如我們做一個槍戰的遊戲,那麼發射子彈時“嘭”的聲音,嵌入到檔案是合适的選擇。當然,這個不可以一概而論,需要根據實際情況做決定。

<b>      </b>下面我以嵌入和播放MP3為例,簡單介紹下怎麼嵌入資源和使用嵌入的資源:

<b>      </b>(1) 首先,将mp3導入到庫,如下圖所示:

<b>      </b>(2) 在庫裡,右鍵點選剛加載的mp3,選擇“連結”,如下圖:

<b>      </b>(3) 自己取一個合适的類名,注意也不要用到Flash的關鍵字哦,如下圖所示:

<b>      </b>(4) 在Flash的第一幀寫入代碼如下:

<b>      </b>var mp3:dance = new dance();

<b>      </b>mp3.play();

<b>      </b>運作下,是否聽到導入的聲音了呢 :)

      類的用法就先講到這裡了。如果你全部弄明白的話,那麼一般的類的用法應該都會了。接下來,就要看你自己的發揮,把類用到實處了。呵呵!

本文轉自 windtoto 51CTO部落格,原文連結:http://blog.51cto.com/windtoto/385256,如需轉載請自行聯系原作者

繼續閱讀