<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,如需轉載請自行聯系原作者