当您创建一个扩展超类的空白子类时,您正在创建一个为父类提供相同接口(具有相同实现)的新类。
也就是说,如果您的父类包含一个方法doSomething
,那么您的子类即使没有实际编写它,也将拥有该doSomething
方法。对此的一个警告是,如果方法被标记private
,在这种情况下,继承类 SubClass 将无权访问。
package {
public class SuperClass {
public function SuperClass():void {
self.doSomething();
}
public function doSomething():void {
trace("doing something");
}
}
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
}
}
一旦建立了这种关系,您就可以决定调用doSomething
SubClass 实例的行为是否与 SuperClass 中定义的默认实现不同。如果您想要相同的行为,请保持原样。如果您想要不同的行为,则使用关键字覆盖父类的方法override
。
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("doing another thing instead");
}
}
}
现在调用doSomething
SubClass 实例的东西将得到修改的行为。但是没有触及默认实现。SuperClass 的实例不会被方法的这种覆盖所修改。只有 SubClass 的实例会受到影响。
属性也是如此。
有一个例外,那就是静态属性。静态属性是类的属性,而不是类实例的属性。静态属性不会被继承。静态属性如下所示:
package {
public class SuperClass {
public static var i:int = 0;
public function SuperClass():void {
}
public function doSomething():void {
trace("doing something");
}
}
SubClass 类不会引用静态属性 i。但是,SubClass 实例可以更改 SuperClass 的静态值。举个例子:
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("changing something in SuperClass");
SuperClass.i = 1;
}
}
}
现在,SuperClass 的静态变量i
的值是 1,而不是 0。这样,SubClass 就有可能(尽管任何具有正确访问权限的代码都具有相同的潜力)来更改 SuperClass 的属性。
我希望这有帮助。