什么是包和命名空间

什么是包?
使用包有两个好处:
   1. 可以减少类命名的冲突.
   2. 可以将共同实现某一特定功能的一些类定义绑定到一起.

你肯定认识不止一个叫"王刚"的,但他们并不是一个人,因为他们的住址不一样(虽然有点牵强,只是为了帮助理解),而这个住址就表示包路径.

所以只要包路径不同,我们一样可以自定义一个Sprite类:

package namespaceExample
{
    public class Sprite
    {
        public function Sprite()
        {
            trace("这是在namespaceExample包下的Sprite,与flash的sprite基类不同!");
        }
    }
}


然后再声明这个自定义的Sprite变量时,为了让AS3可以知道我们所说的"王刚"不是演和珅的"王刚",记得把地址写上:

package namespaceExample
{
    import flash.display.Sprite;
    public class Main extends Sprite
    {
        public function Main()
        {
            var s:namespaceExample.Sprite=new namespaceExample.Sprite();
        }
    }
}


这样可以在输出面板中看到"这是在namespaceExample包下的Sprite,与flash的sprite基类不同!".
什么是命名空间?
命名空间的作用主要是控制标识符(如属性名和方法名)的可见性.
太专业了,说的再通俗一点.
比如你住的小区里新建了一个很大的游泳馆,但为了保持游泳馆的清洁,居委会决定只有小区居民可以使用.所以游泳馆的开放权需要public(如果 private的话,那就限制到只有游泳馆的工作人员才可以用了!).但是一旦public开放权,就对所有人(包括小区外的人)都公开了.这不是我们想 要的.所以开发 权应该是xiaoQuPublic而不是public.

1. 首先,定义xiaoqu_public命名空间,该命名空间只对namespaceExample.xiaoQu可见

      package namespaceExample.xiaoQu
      {
          //定义命名空间,访问控制类型默认为internal类型
          namespace xiaoqu_public="http://blog.sina.com.cn/ladeng6666";
      }


2. 使用xiaoqu_public命名空间定义游泳馆里的开放open方法:

      package namespaceExample.xiaoQu
      {
        
          public class YouYongGuan
          {
              public function YouYongGuan()
              {
              }
              //声明自定义命名空间xiaoqu_public的方法
              xiaoqu_public function open():void
              {
                  trace("游泳馆只对小区人员开放");
              }
          }
      }


3. 新建小区居民resident类,在该类中开启xiaoqu_public命名空间后,就可以访问游泳馆的open方法了

      package namespaceExample.xiaoQu
      {
          public class Resident
          {
              //开启命名空间,这才可以使用该命名空间所声明的属性或者方法
              use namespace xiaoqu_public;
            
              public function Resident()
              {
                
              }
              public function goSwim():void
              {
                  var yyg:YouYongGuan=new YouYongGuan();
                  //开启命名空间后,这里使用youyongguan的open方法就是正确的
                  yyg.open();
              }
          }
      }


4. 文档Main类:

      package namespaceExample
      {
          import flash.display.Sprite;
        
          import namespaceExample.xiaoQu.Resident;
          import namespaceExample.xiaoQu.YouYongGuan;
          import namespaceExample.xiaoQu.xiaoqu_public;
        
          public class Main extends Sprite
          {
              public function Main()
              {
                  var s:namespaceExample.Sprite=new namespaceExample.Sprite();
                
                  var yyg:YouYongGuan=new YouYongGuan();
                  //因为xiaoqu_public命名空间只对namespaceExample.xiaoQu可见,所以这里调用yyg.open()方法会提示编译错误.
                  //yyg.open();
                  var r:Resident=new Resident();
                  //居民中goSwim时,游泳馆是开放的!
                  r.goSwim();
              }
          }
      }


这样感觉自定义xiaoqu_public跟internal的意义差不多了,但是如果自定义命名空间多了的话,让使用者去猜方法对应的命名空间也是件很恼人的事!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值