Flash AS 教程:構造函數(Constructor)
2020-07-17 13:19:22
供稿:網友
構造函數(Constructor)
構造函數是指一個名字與類名相同的方法。當該類被實例化時,該函數會被自動調用,也可以傳入參數,例如:
首先,創建一個類:
package {
public class MyClass {
public function MyClass(arg:String) {
trace("constructed");
trace("you passed " arg);
}
}
}
然后,假設工作在 Flash CS3 IDE(集成開發環境)中,在時間軸上創建該實例:
var myInstance:MyClass = new MyClass("hello");
結果輸出:
constructed
you passed hello
繼承(Inheritance)
一個類可以從另一個類中繼承(inherit)和擴展(extend)而來。這就意味著它獲得了另一個類所有的屬性和方法(除了那些被 private 掩蓋住的屬性)。所生成的子類(派生類)還可以增加更多的屬性和方法,或更改父類(基類)已有的屬性或方法。要分別創建兩個類來實現(兩個獨立的 .as文件),例如:
不要忘記,每個類都必須在其自身的文件中,文件名為該類的類名,擴展名 .as,所以必須要有 MyBaseClass.as 文件和 MySubClass.as 文件。因此,在使用 Flash CS3 IDE 時,保存的 FLA 文件,要與這兩個類在同一個文件夾。
下面代碼會生產兩個實例,把它寫入時間軸看看會發生什么:
var base:MyBaseClass = new MyBaseClass();
base.sayHello();
var sub:MySubClass = new MySubClass();
sub.sayHello();
sub.sayGoodbye();
第一個實例沒什么可說的,值得注意的是第二個實例中的 sayHello 方法,雖然在 MySubClass 中沒有定義 sayHello,但它卻是繼承自 MyBaseClass 類的。另一個值得注意的是,增加了一個新的方法 sayGoodbye,這是父類所沒有的。
下面說說,在子類中如何改變一個父類中已存在的方法。在 AS 2 中,我們可以只需要重新定義這個方法就可以了。而在 AS 3 中,則必需明確地寫出 override 關鍵字,來進行重新定義。
package {
public class MySubClass extends MyBaseClass {
override public function sayHello():void {
trace("Hola from MySubClass");
}
public function sayGoodbye():void {
trace("Goodbye from MySubClass");
}
}
}
請注意,原來的 sayHello 方法被重寫,再調用 MySubClass 后,就有了新的信息。另外,私有成員也不能被重寫,因為它們只能被它們自身的類訪問。
MovieClip/Sprite 子類
我們可以自己寫一個類,然后讓另一個類去繼承它。在 AS 3 中,所有代碼都不是寫在時間軸上的,那么它們一開始都要繼承自 MovieClip 或 Sprite。 MovieClip 類是影片剪輯對象屬性和方法的 ActionScript 模板。它包括我們所熟悉的屬性如:影片的 x,y 坐標,縮放等,這些在 AS 3 中的變化不大。
AS 3 還增加了 Sprite 類,通常把它理解為不在時間軸上的影片剪輯。很多情況下,只使用代碼操作對象,并不涉及時間軸和幀,這時就應該使用 Sprite 這個輕型的類。如果一個類繼承自 MovieClip 或 Sprite ,那么它會自動擁有該類所有的屬性和方法,我們還可以為這個類增加特殊的屬性和方法。
例如,游戲設計一個太空船的對象,我們希望它擁有一個圖形,并且在屏幕的某個位置移動,旋轉,并為動畫添加 enterFrame 偵聽器,還有鼠標、鍵盤的偵聽等。這些都可以由 MovieClip 或 Sprite 來完成,所以就要繼承自它們。同時,還可以增加一些屬性如:速度(speed)、油量(fuel)、損壞度(damage),還有像起飛(takeOff)、墜落(crash)、射擊(shoot)或是自毀(selfDestruct)等方法。那么這個類大概是這樣的:
package {
import flash.display.Sprite;
public class SpaceShip extends Sprite {
private var speed:Number = 0;
private var damage:Number = 0;
private var fuel:Number = 1000;
public function takeOff():void {
//...
}
public function crash():void {
//...
}
public function shoot():void {
//...
}
public function selfDestruct():void {
//...
}
}
}
注意,首先要導入 flash.display 包中的 Sprite 類,如果要導入MovieClip類,同樣也需要導入這個相同的包 flash.display.MovieClip 類。