Flash CS3 文件 |
|||
| ActionScript 3.0 程式設計 > 使用 ActionScript 設計物件導向程式 > 類別 > 類別 Property 特質 | |||
在探討 ActionScript 物件模型中,「屬性」一詞可以代表任何類別的成員,包括變數、常數和方法,與在 ActionScript 3.0 語言和組件參考 中的使用方式不同,後者的用法較為狹窄,而且所包含的類別成員僅為變數或由 getter 或 setter 方法定義的成員。在 ActionScript 3.0 中,有一組特質可配合任何類別的屬性使用,下表列出這組特質的清單。
|
特質 |
定義 |
|---|---|
|
|
相同套件之內的參考可以看見。 |
|
|
相同類別之中的參考可以看見。 |
|
|
相同類別及衍生類別之中的參考可以看見。 |
|
|
任何一處的參考都可以看見。 |
|
|
指定屬性屬於類別,而不屬於該類別的實體。 |
|
|
由使用者定義的自訂命名空間名稱。 |
ActionScript 3.0 提供四個特殊的特質,可控制類別之內所定義屬性的存取:public、private、protected 和 internal。
public 特質可讓屬性在您的 Script 中隨處可見。例如,若要讓方法可供套件之外的程式碼使用,您必須以 public 特質宣告該方法。這對任何屬性都成立,不管是使用 var、const 或 function 關鍵字宣告都一樣。
private 特質可以讓一個屬性只有其定義類別的呼叫者可以看見;這種行為方式與 ActionScript 2.0 中的 private 特質不同,在後者中可以讓子類別存取父類別中的私有屬性。另外一項重要的行為方式改變則與執行階段存取有關:在 ActionScript 2.0 中,private 關鍵字只在編譯階段才禁止存取,而在執行階段則很容易規避限制加以運用;在 ActionScript 3.0 中情形已經改變,標記為 private 的屬性在編譯階段或執行階段都無法使用。
例如,下列程式碼會建立名為 PrivateExample 而有一個私有變數的簡單類別,然後會嘗試從類別之外存取此私有變數。在 ActionScript 2.0 中禁止了編譯階段存取,然而卻可以使用屬性存取運算子 ([]),輕易避開禁令,這個運算子會在執行階段而不在編譯階段進行屬性查閱。
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar); // 嚴謹模式中的編譯階段錯誤
trace(myExample["privVar"]); // ActionScript 2.0 允許存取,但在 ActionScript 3.0 中則為執行階段錯誤。
在 ActionScript 3.0 中,若使用嚴謹模式,嘗試使用點運算子 (myExample.privVar) 存取私有屬性會導致編譯階段錯誤;否則,就會在執行階段報告錯誤,跟使用屬性存取運算子 (myExample["privVar"]) 時的情形一樣。
下表摘要列出嘗試存取屬於密封 (而非動態) 類別之私有屬性的結果:
|
嚴謹模式 |
標準模式 |
|
|---|---|---|
|
點運算子 ( |
編譯階段錯誤 |
執行階段錯誤 |
|
方括號運算子 ( |
執行階段錯誤 |
執行階段錯誤 |
在以 dynamic 特質宣告的類別中,嘗試存取私有變數將不會產生執行階段錯誤,而是根本就看不見變數,因此 Flash Player 會傳回值 undefined;但是如果在嚴謹模式中使用點運算子,則會發生編譯階段錯誤。下列範例基本上與上一個範例完全相同,只不過 PrivateExample 類別是宣告為動態類別:
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar); // 嚴謹模式中的編譯階段錯誤
trace(myExample["privVar"]); // 輸出:undefined
一般來說,類別之外的程式碼嘗試存取私有屬性時,動態類別會傳回值 undefined 而不會產生錯誤。下表顯示,只有使用了點運算子,在嚴謹模式中存取私有屬性時,才會產生錯誤:
|
嚴謹模式 |
標準模式 |
|
|---|---|---|
|
點運算子 ( |
編譯階段錯誤 |
|
|
方括號運算子 ( |
|
|
protected 特質是 ActionScript 3.0 中新增的特質,它會讓位於屬性本身所在類別或子類別之中的呼叫者看見該屬性;也就是說,一個保護的屬性是在本身類別之內,或是對於位在其下繼承階層中任何一處的類別,才能使用,不管子類別是位於相同或不同的套件中都一樣。
對於熟悉 ActionScript 2.0 的使用者來說,這項功能類似於 ActionScript 2.0 中的 private 特質。ActionScript 3.0 的 protected 特質也類似於 Java 的 protected 特質,不同之處在於 Java 版本的特質也允許位於相同套件的呼叫者加以存取。當您的子類別需要一個變數或方法,而您要隱藏此變數或方法,不要讓繼承鏈之外的程式碼看見時,protected 特質就很有用。
internal 特質是 ActionScript 3.0 中新增的特質,可以讓位於屬性本身套件中的呼叫者看見該屬性。這是套件之內程式碼的預設特質,會套用至沒有下列其它特質的任何屬性:
public private protected internal 特質類似於 Java 中的預設存取控制,不過在 Java 中此層級的存取並沒有明確的名稱,而僅能透過省略其它任何存取修飾語來完成這項操作。您可以在 ActionScript 3.0 中使用 internal 特質,讓您能夠選擇明確地表示,是刻意要讓屬性僅供在本身套件之內的呼叫者看見。
static 特質可配合以 var、const 或 function 關鍵字宣告的屬性一併使用,讓您將屬性附加至類別,而不是附加至類別的實體。類別外部的程式碼必須使用類別名稱 (而不是使用實體名稱) 呼叫靜態屬性。
靜態屬性並不會由子類別加以繼承,但這種屬性是子類別範圍鏈的一部分;也就是說,在子類別的主體之內,不必參考定義此變數或方法的類別,就可以使用靜態變數或方法。如需詳細資訊,請參閱靜態屬性不繼承。
若不使用預先定義的存取控制特質,另外還有一個方法,就是建立自訂命名空間做為特質使用。每個定義只有一個命名空間特質可用,而且不能結合命名空間特質與任何存取控制特質 (public、private、protected、internal) 同時使用。如需有關使用命名空間的詳細資訊,請參閱命名空間。
Flash CS3
目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000062.html