0

当“子类”扩展“超类”时,当它继承其方法和属性时,它会创建与“超类”区分开来的方法和属性?

或者,如果我创建一个“子类”的实例并尝试修改一个从“超类”继承的属性,我是否也在修改超类属性?

谢谢。

编辑

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;
4

2 回答 2

2

我将简要解释一下。

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

SuperClass 有四种方法:

  • 私有函数方法Private():void;
  • 受保护的函数方法Protected():void;
  • 公共函数方法Public():void;
  • 内部函数方法Internal():void;

从子类你:

  1. 无法访问 methodPrivate():void;
  2. 可以访问 methodProtected():void; 但就像您的私有方法一样,这意味着您无法从子类外部访问它。
  3. 可以访问 methodPublic():void; 如果从子类外部也可以访问所有内容。
  4. 方法内部():无效;可用于 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 都可以访问的变量 - 只需将其声明为受保护或公共。

希望这很清楚。

于 2012-06-01T21:56:49.223 回答
1

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

也就是说,如果您的父类包含一个方法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 {}
    }
}

一旦建立了这种关系,您就可以决定调用doSomethingSubClass 实例的行为是否与 SuperClass 中定义的默认实现不同。如果您想要相同的行为,请保持原样。如果您想要不同的行为,则使用关键字覆盖父类的方法override

package {

    import SuperClass;

    public class SubClass extends SuperClass {

        public function SubClass():void {}

        override public function doSomething():void {
            trace("doing another thing instead");
        }
    }
}

现在调用doSomethingSubClass 实例的东西将得到修改的行为。但是没有触及默认实现。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 的属性。

我希望这有帮助。

于 2012-06-01T21:26:10.087 回答