对于实例属性,无论是使用 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 关键字声明的属性。此外,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 关键字声明的属性,但不能对其进行覆盖。覆盖某一属性就表示在子类中重新定义该属性。唯一可覆盖的属性类型是 get 和 set 取值函数(使用 function 关键字声明的属性)。虽然不能覆盖实例变量,但是通过为实例变量创建 getter 和 setter 方法并覆盖这些方法,可实现类似的功能。