2011年7月19日 星期二

[AS3] 命名空間namespace及小實例

※ 應將public、private、protected、internal存取控制指定字視為內建的命名空間。
※ 命名空間可控制方法和屬性的能見度。
※ 屬性和方法的名稱永遠包含識別名稱和命名空間。只要定義之前未有命名空間特質,預設就會以internal命名空間加以限定。(只有在相同套件內的呼叫者才看得見)

※ 使用命名空間三個基本步驟:

(A) 定義命名空間:使用 namespace 關鍵字來定義命名空間
//使用public讓其它套件的程式碼獲取namespaceExample命名空間的可見度
package  example{
public namespace namespaceExample;
}


(B) 套用命名空間:
namespaceExample function doJob():void{}


(C) 參考命名空間
  1.  use namespace 指令參考命名空間
    use namespace namespaceExample;

    var counterAddition:CounterAddition = new CounterAddition();

    counterAddition.doJob(1,2);

    trace(counterAddition.getAnswer);

  2. 或 使用名稱修飾語 (::) 標點符號
    var counterAddition:CounterAddition = new CounterAddition();

    counterAddition.namespaceExample::doJob(1,2);

    trace(counterAddition.namespaceExample::getAnswer);


※ 命名空間namespace小小實例
當public、private、protected、internal四個存取控制指定子的存取權限不符合使用,比如說有一些「方法」分散在不同套件的類別裡,若想讓所有套件都可以存取,但又不想讓這些方法變成公用方法,此時就可透過建立命名空間namespace,做為自定義的特殊存取控制指定子。以下例子將不同套件內的類別方法,整合到相同的命名空間中,透過參照命名空間的use namespace陳述式,或名稱修飾語 (::) 標點符號可調用這些方法。


下圖為檔案結構:



1000718_namespaceT1.fla





//namespaceExample.as
package  example{
public namespace namespaceExample;
}


//CounterAddition.as
package  example.addition{
import example.namespaceExample;
public class CounterAddition  {
public var answer:Number;
public function CounterAddition() {
return;
}
namespaceExample function doJob(_a:Number,_b:Number):void{
this.answer = _a + _b;
return;
}
namespaceExample function get getAnswer():Number{
return this.answer;
}
}
}


CounterSubtraction.as
package example.subtraction {
import example.namespaceExample;
public class CounterSubtraction {
public var answer:Number;
public function CounterSubtraction() {
return;
}
namespaceExample function doJob(_a:Number,_b:Number):void{
this.answer = _a - _b;
return;
}
namespaceExample function get getAnswer():Number{
return this.answer;
}
}
}


NamespaceT1_1000718.as
package  {
import flash.display.MovieClip;
import example.namespaceExample;
import example.addition.CounterAddition;
import example.subtraction.CounterSubtraction;

public class NamespaceT1_1000718 extends MovieClip {
public function NamespaceT1_1000718() {
var counterAddition:CounterAddition = new CounterAddition();
counterAddition.namespaceExample::doJob(1,2);
trace(counterAddition.namespaceExample::getAnswer);
var counterSubtraction:CounterSubtraction = new CounterSubtraction();
counterSubtraction.namespaceExample::doJob(3,1);
trace(counterSubtraction.namespaceExample::getAnswer);
/*use namespace namespaceExample;
var counterAddition:CounterAddition = new CounterAddition();
counterAddition.doJob(1,2);
trace(counterAddition.getAnswer);
var counterSubtraction:CounterSubtraction = new CounterSubtraction();
counterSubtraction.doJob(3,1);
trace(counterSubtraction.getAnswer);*/
return;
}
}
}







Download

沒有留言: