【转】从AS2到AS3之二 ——访问控制以及命名空间
- 作者:flashlizi
- 来自:经典论坛
在AS2中我们已经知道有 public, private 这2个访问控制符,在AS3中增加了 internal 和 protected,并且对类、方法的访问控制更加严格,也更加合理和方便。另外,AS3中还增加了命名空间 namespace ,这样我们的访问控制更是灵活无比。(public和private相信大家已经熟悉了,故不赘述)如有错误,敬请指正。
internal指明类、变量、常数、方法等在包package级别可访问到。大家可能会问它和public与private的区别。public只能在package{}中才能使用,但public控制的类或方法可以在任何地方访问到;private只能在class{}中才能使用,它控制的类或方法仅能在相应的class中才能访问到。而internal可以在package{}外使用,但它只能作用于这个as文件内部。比如如下DDD.as中代码为:
1package flashrek.example{
2 public class DDD {
3 function DDD() {
4 var e:EEE=new EEE();
5
6 }
7 }
8}
9internal var internalStr:String="internalStr";
10class EEE {
11 function EEE() {
12 trace(internalStr);
13 }
14}
那么如下代码运行结果为:
1import flashrek.example.DDD;
2var d=new DDD();//输出:internalStr
3trace(internalStr);//输出:错误Err
可以看出,类DDD可以访问到package外的类EEE(默认就是internal,因此可以省略),而类EEE也可以访问到变量internalStr。而DDD.as文件外的其他地方就无法访问到EEE和internalStr了。
和internal不同,protected只能应用于类class内。它指明变量、常数、方法等在类class级别可访问到。与private区别在于,protected指定的方法、变量等是可以继承的,在子类中能访问到他们。
AS3中还引入了命名空间namespace。当你有一些有特殊用途的方法分布在不同的包package里,你想要这些方法在所有package里都可以应用,但你又不想把这些方法设置为public。这个时候,namespace就能达到你的目的。
首先你要定义一个namespace,(flashrek.as):
1package flashrek.example{
2 public namespace flashrek= "www.flashrek.com";
3}
然后在AAA.as文件中的代码为:
1package flashrek.example{
2 import flashrek.example.flashrek;
3 public class AAA {
4 function AAA() {
5 var b:BBB=new BBB();
6 //flashrek::NStest();
7 }
8 flashrek function NStest() {
9 trace("namespace test");
10 }
11 }
12}
13//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
14//package外是不能使用public关键字的。
15internal class BBB {
16 function BBB() {
17 trace("BBB");
18 var c:CCC=new CCC();
19 }
20}
21class CCC {
22 function CCC() {
23 trace("CCC");
24 }
25}
接下来再看运行结果:
1import flashrek.example.AAA;
2import flashrek.example.flashrek;
3var a=new AAA();
4a.flashrek::NStest();
5//输出:
6BBB
7CCC
8namespace test
由此我们可以看出,通过a.flashrek::NStest();这样的方法,我们可以访问到NStest方法,而其他地方是无法直接访问到这个方法的。
在上例中大家发现,namespace很像一个类。确实有点像:)但namespace可以在package外,class内进行定义,而且也可以用public、internal等来进行访问控制。
比如去掉上例中的flashrek.as,而把AAA.as改成如下:
1package flashrek.example{
2 public class AAA {
3 function AAA() {
4 var b:BBB=new BBB();
5 flashrek::NStest();
6 }
7 flashrek function NStest() {
8 trace("namespace test");
9 }
10 }
11}
12//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
13//package外是不能使用public关键字的。
14namespace flashrek= "www.flashrek.com"
15internal class BBB {
16 function BBB() {
17 trace("BBB");
18 var c:CCC=new CCC();
19 }
20}
21class CCC {
22 function CCC() {
23 trace("CCC");
24 }
25}
在这里 namespace flashrek 定义在package外,它只能在package级别访问到。因此用a.flashrek::NStest();是错误的。
- 文章ID:335
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/as2toas3-2/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。