繁体   English   中英

AS3继承

[英]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;

我将简要解释。

我们有两个类-子类和超类。

超类有四种方法:

  • 私有函数methodPrivate():void;
  • 受保护的函数methodProtected():void;
  • 公共函数methodPublic():void;
  • 内部函数methodInternal():void;

在子类中,您:

  1. 无法访问methodPrivate():void;
  2. 可以访问methodProtected():void; 但是就像您的私有方法一样,这意味着您不能从Subclass外部访问它。
  3. 可以访问methodPublic():void; 如果从Subclass外部也可以访问所有内容。
  4. methodInternal():void; 可用于SuperClass包中的类。

但是,您可以覆盖这些方法。 重写不会更改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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM