[英]AS3 Inheritance
当“子类”扩展“超级类”时,当其继承其方法和属性时,会创建与“超级类”区分开的方法和属性吗?
或者,如果我创建“ SubClass”的实例并尝试修改从“ SuperClass”继承的属性,我是否也在修改超类属性?
谢谢。
编辑
package {
public class SubClass extends SuperClass {
public function SubClass() {
trace('superclass value n='+superClass.n+'\n');
trace('subclass changes inherited n'+'\n');
n = 3;
trace('subclass value n='+n+'\n');
trace('superclass value n='+superClass.n+'\n');
}
}
}
返回我:
superclass value n=-1;
subclass changes inherited n;
subclass value n=3;
superclass value n=3;
我将简要解释。
我们有两个类-子类和超类。
超类有四种方法:
在子类中,您:
但是,您可以覆盖这些方法。 重写不会更改SuperClass的方法,而只会在SubClass中更改它们。
override public function methodPublic() : void {
// your additional code
super.methodPublic(); // eventually calling the same method of SuperClass, you can pass arguments to it also
}
如您所知,您的SuperClass也可以具有变量,也可以是公共变量,受保护变量,私有变量或内部变量。 您不能覆盖它们,但是可以使用getter或setter来做到这一点。
您可以访问使用“ super”一词创建为公共变量或受保护变量,如下所示:super.someVariable。
因此,一切都取决于您,如果您想在SuperClass和SubClass中创建相同名称的不同变量,只需在SuperClass中声明一个私有变量即可。 如果您想拥有一个SuperClass和SubClass都可以访问的变量-只需将其声明为protected或public。
希望那是清楚的。
创建扩展SuperClass的空白SubClass时,将创建一个新类,该类为父类提供相同的接口(具有相同的实现)。
就是说,如果您的父类包含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 {}
}
}
一旦建立了这种关系,就可以决定在SubClass实例上调用doSomething
的行为与在SuperClass中定义的默认实现是否有所不同。 如果您想要相同的行为,则将其保持原样。 如果您想要不同的行为,则可以使用关键字override
父类的方法。
package {
import SuperClass;
public class SubClass extends SuperClass {
public function SubClass():void {}
override public function doSomething():void {
trace("doing another thing instead");
}
}
}
现在,在SubClass实例上调用doSomething
的对象将获得修改后的行为。 但是没有触及默认实现。 方法的此重写不会修改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的属性(尽管任何具有正确访问权限的代码都具有相同的潜力)。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.