2006年1月9日 星期一

ActionScript 3.0 Class as Namespace   [+/-]

Ticore's Blog

這只是 Flex 2.0 Alpha 暴力測試的結果
Flex 2.0 Beta 1 已經修正了,無法這樣使用

將class當作namespace使用:

package idv.ticore {
 import flash.util.*;
 public class PublicClass {
  
  public function PublicClass() {
   nsClass1::test();
   nsClass2::test();

   //trace((getClassByName("idv.ticore.PublicClass"))::test);
   //Main Thread (Suspended: TypeError: Error #1034:
   //Type Coersion failed: cannot convert idv.ticore::PublicClass$ to Namespace)
  }
  
  internal function test():Void {
   trace(this + ".test()");
  }
  
  nsClass1 function test():Void {
   trace(this + ".nsClass1::test()");
  }
  nsClass2 function test():Void {
   trace(this + ".nsClass2::test()");
  }
 }
 
 private class nsClass1{
 }
 private class nsClass2{
 }
}

以巢狀static class為namespace:

package idv.ticore {
 import flash.util.*;
 import flash.system.*;
 public class PublicClass {
  
  public static class scns1 {
   public static class scns2 {
    public static class scns3 {
     
    }
   }
  }
  
  public function PublicClass() {
   
   (scns1)::test();
   ((scns1).scns2)::test();
   (((scns1).scns2).scns3)::test();
   
  }
  
  internal function test():Void {
   trace(this + ".test()");
  }
  
  scns1 function test():Void {
   trace(this + ".scns1::test()");
  }
  
  (scns1).scns2 function test():Void {
   trace(this + ".((scns1).scns2)::test()");
  }
  ((scns1).scns2).scns3 function test():Void {
   trace(this + ".(((scns1).scns2).scns3)::test()");
  }
 }
}

Read more...

2006年1月6日 星期五

ActionScript 3 Namespace   [+/-]

Ticore's Blog

namespace宣告的方式以及取用的方式

package idv.ticore {
 import flash.util.*;
 
 public class C {
  public namespace ns;
  ns var Var:String = "ns::Var";
  public function useNs1() {
   trace(ns::Var);
   trace(this.ns::Var);
   trace(this.ns::["Var"]);
  }
  public function useNs2() {
   use namespace ns;
   trace(Var);
   trace(this.Var);

   //trace(this["Var"]);
   //Runtime Error: Property Var not found on idv.ticore.C and .....
  }
 }
}

Namespace屬於一特定的class,每次宣告namespace mySpace;時,會自動建立該class (instance?)

package idv.ticore {
 import flash.util.*;
 public class C {
  
  namespace ns;
  ns var name:String;
  
  public function C() {
   trace(ns);  // output: ns$0
   trace(C.ns);  // output: ns$0
   trace(idv.ticore.C.ns); // output: ns$0
   trace(ns is Namespace); // output: true
   ns::name = "Cns";
   trace(ns::name);
  }
 }
}

Namespace可以宣告在function block內、class內部或是package之下

package idv.ticore {
 import flash.util.*;
 
 private namespace packageNs;
 
 //packageNs var packageVar:String = "";
 //使用者定義的namespace只能用在class內部
 
 public class C {
  
  namespace classNs;
  classNs var classVar:String = "classVar with classNs";
  packageNs var classVar:String = "classVar with packageNs";
  
  public function C() {
   
   namespace localNs;
   localNs var localVar:String = "localVar with localNs";
   classNs var localVar:String = "localVar with classNs";
   packageNs var localVar:String = "localVar with packageNs";
   
   trace(classNs::classVar); // output: classVar with classNs
   trace(packageNs::classVar); // output: classVar with packageNs
   
   trace(localNs::localVar); // output: localVar with localNs
   trace(classNs::localVar); // output: localVar with classNs
   trace(packageNs::localVar); // output: localVar with packageNs
   
  }
 }
}

建立在package底下的namespace可以使用public、internal、private存取修飾子;
使用public、internal修飾子的時候,該namespace必須要單獨宣告在一個.as file內,並且以該namespace為檔名

packageNs.as:

package idv.ticore {
 public namespace packageNs;
}

public可以當做一個namespace直接使用

package idv.ticore {
 import flash.util.*;
 
 public class C {
  
  public var classVar:String = "public::classVar";
  
  public function C() {
   trace(public::classVar); // output: public::classVar
  }
 }
}
package idv.ticore {
 import flash.util.*;
 
 public class C {
  public namespace ns;
  public::ns var Var:String = "ns::Var";
  public function C() {
   trace(ns::Var);
   trace((public::ns)::Var);
   trace((((public)::ns)::Var));
   trace(this.ns::["Var"]);
  }
 }
}

namespace可以疊加使用

package idv.ticore {
 import flash.util.*;
 
 public class C {
  
  namespace ns1;
  ns1 namespace ns2;
  ns1::ns2 namespace ns3;
  (ns1::ns2)::ns3 namespace ns4;
  
  ns1::ns2 var classVar:String = "ns1::ns2::classVar";
  (ns1::ns2)::ns3 var classVar:String = "ns1::ns2::ns3::classVar";
  
  public function C() {
   trace((ns1::ns2)::classVar);  // output: ns1::ns2::classVar
   trace(((ns1::ns2)::ns3)::classVar); // output: ns1::ns2::ns3::classVar
  }
 }
}

宣告在class內部的namespace無法在class以外取用該scope之變數;
將namespace宣告為public僅僅能夠存取namespace class本身,而非該scope底下之變數

public namespace使用方式

test.mxml:

<mx:application xmlns:mx="http://www.macromedia.com/2005/mxml">
 xmlns="*" creationComplete="init();">
 <mx:script>
  <!--[CDATA[
   import flash.util.*;
   import idv.ticore.*;
   
   public function init ():Void {
    var c:C = new C();
    trace(c.ns::Var);
    trace(c.ns::["Var"]);
   }
  ]]>
 </mx:script>
</mx:application>

ns.as:

package idv.ticore {
 public namespace ns;
}

C.as:

package idv.ticore {
 import flash.util.*;
 
 public class C {
  ns var Var:String = "ns::Var";
  public function C() {
   trace(ns::Var);
   trace(this.ns::Var);
   trace(this.ns::["Var"]);
  }
 }
}

Read more...