AS3继承

时间:2012-06-01 21:06:29

标签: actionscript-3 inheritance

当'SubClass'扩展'SuperClass'时,当它继承了它的方法和属性时,它会创建区别于'SuperClass'的方法和属性吗?

或者,如果我创建了一个'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;

2 个答案:

答案 0 :(得分:2)

我将简要解释一下。

我们有两个类 - Subclass和SuperClass。

SuperClass有四种方法:

  • private function methodPrivate():void;
  • protected function methodProtected():void;
  • public function methodPublic():void;
  • 内部函数methodInternal():void;

来自您的子类:

  1. 无法访问methodPrivate():void;
  2. 可以访问methodProtected():void;但就像你的私有方法一样,这意味着你无法从Subclass外部访问它。
  3. 可以访问methodPublic():void;如果来自Subclass之外,一切都可以访问。
  4. methodInternal():无效;适用于SuperClass包中的类。
  5. 但您可以覆盖这些方法。覆盖不会更改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”来访问创建为公共或受保护的变量:super.someVariable。

    所以一切都取决于你,如果你想在SuperClass和SubClass中创建同名的不同变量,只需在SuperClass中将其声明为私有。如果你想拥有一个SuperClass和SubClass都可以访问的变量 - 只需将其声明为protected或public。

    希望很清楚。

答案 1 :(得分:1)

当您创建一个空白的SubClass扩展SuperClass时,您正在创建一个新类,它为父类提供相同的接口(具有相同的实现)。

也就是说,如果您的父类包含方法doSomething,那么您的SubClass在没有实际编写的情况下也会使用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的属性。

我希望这会有所帮助。