Pages

mercredi 18 août 2010

C++ namespace 命名空间

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。(摘自 http://hi.baidu.com/ambitionwzj1818/home

一、命名空间的定义:
1、定义在独立的.as文件中;
e.g.1:
package npClass 
{
public namespace morning;
}
e.g.2:
package npClass 
{
public namespace noon;
}
e.g.3:
package npClass 
{
public namespace night;
}
2、定义在类的内部;
(见e.g.4蓝色)
3、定义在包的外面;
(见e.g.4红色)
e.g.4:
package npInner 
{
import com.hexagonstar.util.debug.Debug;


public class InnerFoo
{
   public namespace inMorning;
   public namespace inNoon;
   public namespace inNight;


  
   public function InnerFoo() 
   {
    /**
    * 类内部引用命名空间
    */
    /*
    use namespace inMorning;
    hello();*/
    /*
    inMorning::hello();*/
   
   }
   inMorning function hello():void
   {
    Debug.trace("Good inMorning!");
   }
   inNoon function hello():void
   {
    Debug.trace("Good inNoon!");
   }
   inNight function hello():void
   {
    Debug.trace("Good inNight!");
   }
  
}
}
/**
* 可以把命名空间定义在包外,使用起来跟定义在类的内部一样,不过不可以用public,非本as文件访问不到
* namespace inMorning;
* namespace inNoon;
* namespace inNight;


*/
定义的方法决定了使用的方法,但是从本质上来说,原理是一样的。
二、命名空间的应用:
1、应用内部定义的命名空间;
(见e.g.4紫色)
2、应用外部定义的(独立)命名空间;
跟内部不一样在于,如果不在同一个包中,要先import进来。
e.g.5:
package npClass
{
import npClass.morning;
import npClass.noon;
import npClass.night;


import com.hexagonstar.util.debug.Debug;




public class Foo
{
  
   public function Foo() 
   {
   
   }
   morning function hello():void
   {
    Debug.trace("Good morning!");
   }
   noon function hello():void
   {
    Debug.trace("Good noon!");
   }
   night function hello():void
   {
    Debug.trace("Good night!");
   }
  
}
}
三、命名空间的引用:
package
{
import flash.display.Sprite;
import npClass.Foo;
/**
* 必須把命名空間也導入,才能打開命名空間,調用到該空間下的函數
*/
import npClass.morning;
import npClass.noon;
import npClass.night;
/**
* 写在类内部的命名空间
*/
import npInner.InnerFoo;


import com.hexagonstar.util.debug.Debug;


public class Main extends Sprite 
{
  
   public function Main() 
   {
    init();
   }
  
   private function init():void
   {
    /**
    * 独立.as定义的命名空间
*/

    //var kk:Foo = new Foo();
    /**
    * 用use namespace打開命名空間
    */
    /*
    use namespace noon;
    kk.hello();*/
   
    /**
    * 兩個命名空間不能同時打開,打開就會報錯,因為命名空間打開命令會提前執行
    * 相當于如此:
    * use namespace noon;
    * use namespace night;
    * kk.hello();
    * kk.hello();
    * 下面的命令他就不知道要執行哪個命名空間
    */
    /*use namespace noon;
    kk.hello();
    use namespace night;
    kk.hello();*/
   
    /**
    * 用開啟命名空間符調用
    */
    /*kk.noon::hello();
    kk.morning::hello();
    kk.night::hello();*/
   
   /**
    * 定義在類里面的命名空間
    */


    //var ii:InnerFoo = new InnerFoo();
   
    /**
    * 用开启命名空间符调用
    */
    /*var tp:Namespace = InnerFoo.inMorning;
    ii.tp::hello();*/
   
    /**
    * 用use namespace打开不行,不能这样做
    */
    /*
    use namespace InnerFoo.inMorning;
    ii.hello();
    */
   }
   
}


}

Aucun commentaire:

Enregistrer un commentaire