ActionScript 2.0--動(dòng)態(tài)類VS靜態(tài)類
動(dòng)態(tài)類允許動(dòng)態(tài)的對類進(jìn)行擴(kuò)展(例如允許加入新的屬性或方法)。象Jscript.NET程序中這種方式稱為expando,如果類不是動(dòng)態(tài)類(象Math類)用戶不能加入新的屬性和方法。而在as1中這其實(shí)是很平常的事。就象下面這樣為MOVIECLIP加入新的屬性和方法:
movieClip.protoType.someNewMethed=function(){ 一些方法; }
在as2中這種擴(kuò)展方式是不允許的。然而我可能通過創(chuàng)建子類的方式加入新的屬性和方法。
下面的例子是我們要擴(kuò)展靜態(tài)類Math中的Max()方法.我們要新將其擴(kuò)展為在一些數(shù)中求出最大的數(shù)而不是原先那樣只限定在兩個(gè)數(shù)中求出最大的數(shù)。
dynamic class Math2 extends Math { // store a reference to Math.max() private static var oMax:Function = Math.max; // static class cannot be instantiated private function Math2() {} // override Math.max(), support any number of arguments public static function max():Number { var a:Array = arguments; var n:Number = a.length; if (n > 2) { var m:Number = oMax(a[n-2],a[n-1]); // remove two elements from the end of the array; // could use 'a.length -= 2' as a shortcut as well a.pop(); a.pop(); a.push(m); return Number(max.apply(null, a)); } else if (n == 2) { return oMax(a[0],a[1]); } else if (n == 1) { return a[0]; } else { return oMax(); } } }
不象原有的類那樣,現(xiàn)在我們已經(jīng)對其MAX()方法進(jìn)行了擴(kuò)展將其變成了動(dòng)態(tài)類。并且形成了新的類名為math2.
現(xiàn)在可以試一下了。
trace(Math2.max(70,6,3,12,82,9,28,5));
ActionScript 2.0--繼承
正如前面提到過的。繼承對于OOP編程是很重要的盡管它不是絕對的需要。它用來定義子類與超類之間的關(guān)系。AS2為實(shí)現(xiàn)這一目的設(shè)置了一個(gè)新的關(guān)鍵詞:extends.在上一例中的Math2中我們已經(jīng)使用的了extends這一關(guān)鍵字繼承Math類。它還是比較簡單的。
在構(gòu)造函數(shù)時(shí)首先應(yīng)注意的是super()關(guān)建字。它的作用是調(diào)用超類的構(gòu)造函數(shù),如果你之前沒有在超類中構(gòu)造函數(shù)那么FLASH會(huì)自動(dòng)生成一個(gè)空的構(gòu)造函數(shù)。
值得欣慰的是許多BUG在新版的flash player7中已經(jīng)被修復(fù)。但在FLASHPLAY6仍有bug的問題,如果你不太清楚,可能查看AS1中有關(guān)繼承bug的相關(guān)列表文章。
如果你想要從子類傳遞參數(shù)給你的超類,你應(yīng)確保在你的超類中已有了這些參數(shù)的聲明。否則你會(huì)發(fā)現(xiàn)為什么只有部分的參數(shù)被傳遞。如我們要?jiǎng)?chuàng)建一個(gè)子類名為Child,它繼承自他的父類。我們應(yīng)在構(gòu)造函數(shù)中這樣寫:
class Child extends Parent { private var fName:String = ""; public function Child(lname:String, fname:String) { super(lname); // continue Child's constructor code fName = fname; } }
ActionScript 2.0--導(dǎo)入外部的類文件
為了更好的組織類和避免類名稱的沖突.被許多語言應(yīng)用的概念包被引入.ActionScript 2.0引入包就是為了解決這個(gè)問題.
類名稱的沖突是指什么呢?我們假想有兩個(gè)開發(fā)人員,每個(gè)人都建立了一個(gè)代碼庫.在庫中都有一個(gè)名為utility的類.如果這兩個(gè)代碼庫合在一起使用,這時(shí)就會(huì)造成flash的混亂,不知使用哪一個(gè)庫中的類.
這時(shí)類路徑及來出來挽救,通過將路徑合并到類名稱中.就象是硬盤中的文件一樣,在不同的目錄中可以有相同的文件存在.要指明引用哪一個(gè)類.要在導(dǎo)入過程中使用正確的類路徑.如:
import mx.events.Eventdesign;
一旦類被導(dǎo)入,我們在引用類時(shí)就可能只接使用類名稱而不需要使用類的路徑了.
class MyBroadcaster { public function MyBroadcaster() { EventDesign.initialize(this); } }
當(dāng)然,你也可以不用導(dǎo)入的方式,而是在每次使用時(shí)都指明類的正確路徑.可這樣做會(huì)使人很煩的.當(dāng)多次使用時(shí)要不斷的輸入重復(fù)的東西.
class MyBroadcaster { public function MyBroadcaster() { mx.events.EventDesign.initialize(this); } }
當(dāng)在創(chuàng)建自已的類時(shí),將你的類放在一個(gè)指定的項(xiàng)目目錄中,或是放在一個(gè)公共的類庫中,而不要將其放在
<Flash install folder>\<language>\First Run\Classes\) 或<drive>:\Documents and Settings\<user>\Local Settings\Application Data\Macromedia\Flash MX 2004\<language>\Configuration\Classes\).
這樣做可以使執(zhí)行同步同時(shí)減少編譯時(shí)錯(cuò)誤的出現(xiàn).一種公用的方法是使用你的反面的域名作為類的路徑如
import com.quantumwave.alliance.rebel.Commander;
如果要導(dǎo)入路徑中的所有類.使用通配符*,如下:
import com.quantumwave.*
這一步導(dǎo)入將導(dǎo)入com.quantumwave下的所有的類但在編譯時(shí)只編譯使用到的類,所以你不必?fù)?dān)心導(dǎo)入所有的類會(huì)增大你文件的大小.
ActionScript 2.0--接口
當(dāng)在使用OOP時(shí),除了繼承比較重要之外,在就是接口了.就像JAVA和C#,ActionScript不提供多重繼承(如一個(gè)子類可繼承多個(gè)超類),這是因?yàn)槿绻褂貌划?dāng)在調(diào)試時(shí)就會(huì)象做了一場惡夢一樣.會(huì)造成死循環(huán)和粘連不清的情況,在精心設(shè)計(jì)你的項(xiàng)目時(shí),使用接口可以同樣達(dá)到多重繼承的效果,而不會(huì)出現(xiàn)上面說的那種很麻煩的情況.
一個(gè)接口就象是各類在執(zhí)行方法時(shí)的一種協(xié)議,而通常在各個(gè)類未執(zhí)行方法時(shí)是沒有聯(lián)系的.在接口中沒有代碼沒有屬性,只有方法,它的書寫方式完全就象是在書寫一個(gè)類一樣,除了:
1.它們都沒有屬性
2.它們只有方法的標(biāo)記,參數(shù),類型和返回的類型
3.在方法定義的結(jié)尾只有小括號(hào)而沒有大括號(hào)
下面是一個(gè)可拖動(dòng)的類名為Dragable的范例(通常在命名接口時(shí)通常以大寫的"I"開頭).
interface IDraggable { public function startDrag():Void; public function stopDrag():Void; public function isDragging():Boolean; }
如果要使用Interface需要使用關(guān)鍵字implement.如下面的例子,child類繼承超類同時(shí)使用接口IDraggable.
class Child extends Parent implements IDraggable { public function Child() { // add Child constructor code }
public function startDrag():Void { // implement the code for startDrag(); }
public function stopDrag():Void { // implement the code for stopDrag(); }
public function isDragging():Boolean { // implement the code for isDragging(); } }
唯一在使用接口時(shí)注意的事情是,在類中應(yīng)使用與接口中一樣的方法,參數(shù)類型的定義,通過這種方式接口可以在兩個(gè)不一樣的程序員之間標(biāo)準(zhǔn)化代碼,當(dāng)一個(gè)已知的接口被類使用時(shí),和序員只需知道接口以在不同的類中使用.
出處:WebStudio
責(zé)任編輯:藍(lán)色
上一頁 Flash ActionScript 2.0 基礎(chǔ)教程 [1] 下一頁
◎進(jìn)入論壇Flash專欄版塊參加討論
|