17,一個文件中的多個類
一般來說,一個.as文件中就一個類,但是在AS3中,現在允許在一個文件中定義多個類用來輔助主類。
在.as文件中的輔助類,必須定義在類包以外,并且只針對此文件中的主類和其他輔助類可見。
例如:
package {
class MyClass {
function MyClass() {
var helper:MyHelper = new MyHelper();
}
}
}
class MyHelper {
function MyHelper() {
var helper:HelpersHelper = new HelpersHelper();
}
}
class HelpersHelper {
function HelpersHelper () {
}
}
注意,在包塊中最多只能定義一個類。在同一個文件中的輔助類不是包塊的一部分,并且只能在此文件中可見和被使用。
18,訪問屬性
AS3為類和類成員引入了兩個新的訪問屬性來擴展AS2中的private訪問屬性。在AS3中,現在有下面的訪問控制屬性:
public
protected
private
internal (默認)
public:public屬性和AS2中一樣。在任何地方定義的public屬性,能在任何地方和被任何成員引用。
構造器必須定義成public。
應用程序類必須是public的。
protected:protected是一個新的屬性。被protected指定的成員,只能被其本身或其子類訪問。如果外部類嘗試訪問被protected的成員,將會拋出編譯錯誤。
類和構造器不能被聲明為protected。
private:AS2中已經有private屬性,但是在AS2中,子類成員可以任意的訪問父類的private成員。現在在AS3中,private屬性只能在類內部被訪問,其他類包括子類都不能直接訪問此成員。也就是說,在子類中可以定義一個名稱和父類某成員名稱一樣的成員,只要父類的此成員是聲明為private的。
類和構造器不能被定義為private。
internal:internal和public比較類似,不同的地方在于類成員只能被同一個包中的成員所訪問,而其他包中的成員不能訪問。
internal是除了構造器以外的所有類和類成員的默認聲明。
輔助類的訪問控制有所不同。由于輔助類不屬于任何包,internal的聲明將限制其被訪問只能是當前文件之內。注意:主類不能繼承輔助類,只有輔助類能繼承輔助類,并且要在同一個文件內。
訪問控制的錯誤,并不僅僅是編譯時錯誤,有時候也是運行時錯誤,在AS2中用來訪問隱藏方法的方式,在AS3中不能用了,如:
package {
import flash.display.Sprite;
// 應用類必須定義成public (默認是internal)
public class AccessControl extends Sprite {
// 構造器總是public的
function AccessControl() {
// 只有在這個文件中才能訪問輔助類
var helper:Helper = new Helper();
trace(helper.pubNum); // OK
// trace(helper.protNum); // Error - 錯誤,不能訪問protected成員
// trace(helper.privNum); // Error - 錯誤,不能訪問private成員
trace(helper.interNum); // OK
}
}
}
// 輔助類默認是internal
class Helper {
// public聲明允許在任何地方被訪問
// 變量通常被設置為private的,然后通過聲明public的get set方法來訪問
public var pubNum:Number = 1;
// protected聲明只允許在子類中被訪問
protected var protNum:Number = 2;
// private聲明只能在類內部被訪問
private var privNum:Number = 3;
// internal聲明只允許在同一個包中被訪問
// 但是對于輔助類來說,只能在同一個文件類被訪問
internal var interNum:Number = 4;
// 構造器永遠都是public的
function Helper() {
}
}
// 子輔助類默認是internal的
// 可以繼承其他輔助類
class SubHelper extends Helper {
// 構造器,public
function SubHelper() {
trace(pubNum); // OK
trace(protNum); // OK - 繼承得到的
// trace(privNum); // Error - 不能訪問private
trace(interNum); // OK
}
}
另外一個例子:
package {
import flash.display.Sprite;
import containers.*;
// Application class needs to be public (internal by default)
public class AccessControl extends Sprite {
// constructors are always public
function AccessControl() {
// can access classes in other packages
// only if public
var bowl:Bowl = new Bowl(); // OK
// var basket:Basket = new Basket(); // Error - cannot access internal
trace(bowl.pubNum); // OK
// trace(bowl.protNum); // Error - cannot access protected
// trace(bowl.privNum); // Error - cannot access private
// trace(bowl.interNum); // Error - cannot access internal
}
}
}
ActionScript Code:
package containers {
// public class accessible anywhere
public class Bowl {
// public access granted anywhere
public var pubNum:Number = 1;
// protected access granted only for
// subclasses in that class
protected var protNum:Number = 2;
// private access granted only in this class
private var privNum:Number = 3;
// internal access granted only in the same package
internal var interNum:Number = 4;
// constructors are always public
function Bowl() {
// can access inteneral classes if in same package
var basket:Basket = new Basket();
trace(basket.pubNum); // OK
// trace(basket.protNum); // Error - cannot access protected
// trace(basket.privNum); // Error - cannot access private
trace(basket.interNum); // OK - same package
// clone using public method
var basketCopy:Basket = basket.clone();
}
}
}
ActionScript Code:
package containers {
// interal only accessible
// from other classes in package
internal class Basket {
// public access granted anywhere
public var pubNum:Number = 1;
// protected access granted only for
// subclasses in that class
protected var protNum:Number = 2;
// private access granted only in this class
private var privNum:Number = 3;
// internal access granted only in the same package
internal var interNum:Number = 4;
// constructors are always public
function Basket() {
}
// accessible anywhere as long as
// referencing a Basket instance
public function clone():Basket {
var basket:Basket = new Basket();
basket.pubNum = pubNum; // OK
basket.protNum = protNum; // OK - same class
basket.privNum = privNum; // OK - same class
basket.interNum = interNum; // OK
return basket;
}
}
}
19,抽象類
不幸的是,AS3中并沒有抽象類(只能繼承,不能實例化)。因此你不能在Flash中直接創建抽象類。但是,AS中的一些內置類實際上是抽象類。包括:
DisplayObject
InteractiveObject
DisplayObjectContainer
和抽象類一樣,你不能使用new關鍵字創建這些類的實例。例如:
var myObj:InteractiveObject = new InteractiveObject(); //錯誤
但是,除此之外,在AS中,你也不能創建這些類的直接子類,例如:
package {
import flash.display.DisplayObject;
public class MyDisplay extends DisplayObject{
public function MyDisplay (){
// ERROR
}
}
}
這個類在的特性和在Player中如何定義有關。如果你創建這些類的直接子類并實例化,或者直接實例化這個類,都會出現Argument Error。
因此,如果你想擴展一個抽象類,可以采用擴展抽象類的現有的internal子類的方法。例如,如果你想擴展DisplayObject,你可以擴展Shape,一個輕量級的,internal訪問級別的,DisplayObject的直接子類。
歡迎轉載:http://www.kanwencang.com/bangong/20161206/63900.html
文章列表