實體屬性不管是以 function、var 或 const 關鍵字定義,只要屬性不在基底類別中以 private 特質宣告,所有子類別都會加以繼承。例如,ActionScript 3.0 中的 Event 類別有一些子類別繼承了所有事件物件都相同的繼承屬性。
在一些事件類型上,Event 類別會包含所有必要屬性,以定義事件;這些事件類型不需要定義於 Event 類別以外的實體屬性。這種事件的範例有:complete 事件 (會在順利載入資料時發生);以及 connect 事件 (會在建立網路連線以後發生)。
下列範例摘錄自 Event 類別,其中有一些繼承自子類別的屬性和方法。由於屬性是繼承的,任何子類別的實體都可以存取這些屬性。
public class Event
{
public function get type():String;
public function get bubbles():Boolean;
...
public function stopPropagation():void {}
public function stopImmediatePropagation():void {}
public function preventDefault():void {}
public function isDefaultPrevented():Boolean {}
...
}
其它事件類型需要唯一屬性,這些屬性不能在 Event 類別中使用。這些事件是使用 Event 類別之子類別定義的,因此新屬性可以加入至定義於 Event 類別中的屬性。這種子類別的範例是 MouseEvent 類別,它會加入與滑鼠動作或按滑鼠關聯之事件 (如 mouseMove 和 click 事件) 特有的屬性。下列範例摘錄自 MouseEvent 類別,其中有一些存在於子類別上但不在基底類別上的屬性定義:
public class MouseEvent extends Event
{
public static const CLICK:String= "click";
public static const MOUSE_MOVE:String = "mouseMove";
...
public function get stageX():Number {}
public function get stageY():Number {}
...
}
存取控制指定字和繼承
若屬性是以 public 關鍵字宣告,則此屬性可在程式碼任何一處看見,也就是說,public 關鍵字與 private、protected 和 internal 等關鍵字不同,並沒有對屬性繼承施加任何限制。
若屬性是以 private 關鍵字宣告,則只能在定義此屬性的類別中看見,也就是說,它不會由任何子類別繼承的。這種行為方式與舊版 ActionScript 不同,舊版 private 關鍵字的行為比較像 ActionScript 3.0 的 protected 關鍵字。
protected 關鍵字表示屬性不但能在定義的類別中看見,也能在所有子類別中看見。跟 Java 程式設計語言中的 protected 關鍵字不同,ActionScript 3.0 中的 protected 關鍵字不會讓相同套件中的所有其它類別看見屬性;在 ActionScript 3.0 中,只有子類別可以存取用 protected 關鍵字宣告的屬性。而且,不管子類別是在與基底類別相同的套件或是不同的套件中,保護的屬性都可讓子類別看見。
若要限制屬性在定義該屬性的套件中之可見性,請使用 internal 關鍵字,或者不要使用任何存取控制指定字。internal 存取控制指定字是在未指定時所套用的預設存取控制指定字。相同套件中的子類別才能繼承標記為 internal 的屬性。
您可以使用下列範例,查看每一個存取控制指定字如何跨越套件界限影響繼承。下列程式碼定義名為 AccessControl 的主應用程式類別,以及另外兩個名為 Base 和 Extender 的類別;Base 類別在名為 foo 的套件中,而 Extender 類別是 Base 類別的子類別,在名為 bar 的套件中。AccessControl 類別僅匯入 Extender 類別,並建立 Extender 的實體,嘗試存取在 Base 類別中定義的 str 變數;str 變數是宣告為 public,因此程式碼編譯及執行如下列摘錄中所示:
// Base.as in a folder named foo
package foo
{
public class Base
{
public var str:String = "hello"; // change public on this line
}
}
// Extender.as in a folder named bar
package bar
{
import foo.Base;
public class Extender extends Base
{
public function getString():String {
return str;
}
}
}
// main application class in file named AccessControl.as
package
{
import flash.display.MovieClip;
import bar.Extender;
public class AccessControl extends MovieClip
{
public function AccessControl()
{
var myExt:Extender = new Extender();
trace(myExt.str);// error if str is not public
trace(myExt.getString()); // error if str is private or internal
}
}
}
若要查看其它存取控制指定字如何影響上一個範例的編譯和執行,請在刪除下列 AccessControl 類別這行或將它註解化之後,將 str 變數的存取控制指定字變更為 private、protected 或 internal:
trace(myExt.str);// error if str is not public
不允許覆寫變數
以 var 或 const 關鍵字宣告的屬性可以繼承,但不能加以覆寫。所謂覆寫屬性,就是要在子類別中重新定義屬性。唯一可以覆寫的屬性類型,是取得及設定存取子 (使用 function 關鍵字宣告的屬性)。雖然您不能覆寫實體變數,但是您可以透過為實體變數建立 getter 和 setter 方法,然後覆寫方法,達到類似的功能。