在AS2中我們已經(jīng)知道有public, private 這2個訪問控制符,在AS3中增加了internal和protected,并且對類、方法的訪問控制更加嚴格,也更加合理和方便。另外,AS3中還增加了命名空間namespace,這樣我們的訪問控制更是靈活無比。(public和private 相信大家已經(jīng)熟悉了,故不贅述)如有錯誤,敬請指正。
internal 指明類、變量、常數(shù)、方法等在包package 級別可訪問到。大家可能會問它和public與private的區(qū)別。public只能在package{}中才能使用,但public控制的類或方法可以在任何地方訪問到;private只能在class{}中才能使用,它控制的類或方法僅能在相應的class中才能訪問到。而internal可以在package{}外使用,但它只能作用于這個as文件內(nèi)部。比如如下DDD.as中代碼為: package flashrek.example{ public class DDD { function DDD() { var e:EEE=new EEE();
} } } internal var internalStr:String="internalStr"; class EEE { function EEE() { trace(internalStr); } }
那么如下代碼運行結果為:import flashrek.example.DDD; var d=new DDD();//輸出:internalStr trace(internalStr);//輸出:錯誤Err
可以看出,類DDD可以訪問到package外的類EEE(默認就是internal,因此可以省略),而類EEE也可以訪問到變量internalStr。而DDD.as文件外的其他地方就無法訪問到EEE和internalStr了。
和internal不同,protected只能應用于類class內(nèi)。它指明變量、常數(shù)、方法等在類class級別可訪問到。與private區(qū)別在于,protected指定的方法、變量等是可以繼承的,在子類中能訪問到他們。
AS3中還引入了命名空間namespace。當你有一些有特殊用途的方法分布在不同的包package里,你想要這些方法在所有package里都可以應用,但你又不想把這些方法設置為public。這個時候,namespace就能達到你的目的。
首先你要定義一個namespace,(flashrek.as):
package flashrek.example{ public namespace flashrek= www.flashrek.com; }
然后在AAA.as文件中的代碼為: package flashrek.example{ import flashrek.example.flashrek; public class AAA { function AAA() { var b:BBB=new BBB(); //flashrek::NStest(); } flashrek function NStest() { trace("namespace test"); } } } //package外的類、命名空間不能默認且只能是internal的,且僅能為在此package內(nèi)使用。 //package外是不能使用public關鍵字的。 internal class BBB { function BBB() { trace("BBB"); var c:CCC=new CCC(); } } class CCC { function CCC() { trace("CCC"); } }
接下來再看運行結果:import flashrek.example.AAA; import flashrek.example.flashrek; var a=new AAA(); a.flashrek::NStest(); //輸出: BBB CCC namespace test
由此我們可以看出,通過a.flashrek::NStest();這樣的方法,我們可以訪問到NStest方法,而其他地方是無法直接訪問到這個方法的。
在上例中大家發(fā)現(xiàn),namespace很像一個類。確實有點像:)但namespace可以在package外,class內(nèi)進行定義,而且也可以用public、internal等來進行訪問控制。比如去掉上例中的flashrek.as,而把AAA.as改成如下:
package flashrek.example{ public class AAA { function AAA() { var b:BBB=new BBB(); flashrek::NStest(); } flashrek function NStest() { trace("namespace test"); } } } //package外的類、命名空間不能默認且只能是internal的,且僅能為在此package內(nèi)使用。 //package外是不能使用public關鍵字的。 namespace flashrek= "www.flashrek.com" internal class BBB { function BBB() { trace("BBB"); var c:CCC=new CCC(); } } class CCC { function CCC() { trace("CCC"); } }
在這里namespace flashrek 定義在package 外,它只能在package 級別訪問到。因此用a.flashrek::NStest();是錯誤的。
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2744237-1-2.html
出處:藍色理想
責任編輯:elesa
上一頁 常量 操作符 參數(shù) 下一頁 全新的加載(Loading)機制
◎進入論壇Flash專欄版塊參加討論
|