请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 8501|回复: 5

[AS3] 【从AS2到AS3之二】访问控制以及命名空间 [复制链接]

flashlizi 楼主
帖子
521
体力
2366
威望
131
发表于 2007-5-10 16:23:37 |显示全部楼层
在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中代码为:
  1. package flashrek.example{
  2.         public class DDD {
  3.                 function DDD() {
  4.                         var e:EEE=new EEE();

  5.                 }
  6.         }
  7. }
  8. internal var internalStr:String="internalStr";
  9. class EEE {
  10.         function EEE() {
  11.                 trace(internalStr);
  12.         }
  13. }
复制代码

那么如下代码运行结果为:
  1. import flashrek.example.DDD;
  2. var d=new DDD();//输出:internalStr
  3. trace(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):
  1. package flashrek.example{
  2.         public namespace flashrek= "www.flashrek.com";
  3. }
复制代码


然后在AAA.as文件中的代码为:
  1. package 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关键字的。
  15. internal class BBB {
  16.         function BBB() {
  17.                 trace("BBB");
  18.                 var c:CCC=new CCC();
  19.         }
  20. }
  21. class CCC {
  22.         function CCC() {
  23.                 trace("CCC");
  24.         }
  25. }
复制代码

接下来再看运行结果:
  1. import flashrek.example.AAA;
  2. import flashrek.example.flashrek;
  3. var a=new AAA();
  4. a.flashrek::NStest();
  5. //输出:
  6. BBB
  7. CCC
  8. namespace test
复制代码

由此我们可以看出,通过a.flashrek::NStest();这样的方法,我们可以访问到NStest方法,而其他地方是无法直接访问到这个方法的。

在上例中大家发现,namespace很像一个类。确实有点像:)但namespace可以在package外,class内进行定义,而且也可以用public、internal等来进行访问控制。
比如去掉上例中的flashrek.as,而把AAA.as改成如下:
  1. package 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关键字的。
  14. namespace flashrek= "www.flashrek.com"
  15. internal class BBB {
  16.         function BBB() {
  17.                 trace("BBB");
  18.                 var c:CCC=new CCC();
  19.         }
  20. }
  21. class CCC {
  22.         function CCC() {
  23.                 trace("CCC");
  24.         }
  25. }
复制代码

在这里namespace flashrek定义在package外,它只能在package级别访问到。因此用a.flashrek::NStest();是错误的。
已有 1 人评分威望 收起 理由
mirycat + 2 原创内容

总评分: 威望 + 2   查看全部评分

西部数码顶级域名注册商39元抢注!
帖子
1219
体力
5975
威望
234
发表于 2007-5-11 14:01:51 |显示全部楼层
不错,支持这个系列:)
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

unmen 
帖子
117
体力
242
威望
0
发表于 2007-5-11 14:05:33 |显示全部楼层
支持下.

使用道具 举报

amamam 
帖子
716
体力
1398
威望
0
居住地
福建省 厦门市
发表于 2007-5-24 00:59:29 |显示全部楼层
bucuo

使用道具 举报

HBrO 
帖子
7398
体力
32121
威望
241
居住地
广东省 广州市
发表于 2007-9-4 23:51:59 |显示全部楼层
哎呀,点中我最不明白的要害了.就是关于作用域的问题.

使用道具 举报

zjwps 
帖子
42
体力
173
威望
0
居住地
上海市
发表于 2007-9-5 09:24:55 |显示全部楼层
没用过namespace,到底有什么好处,我在这儿没看出来

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 08:32 , Processed in 0.083004 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部