在AS3

时间:2015-05-01 09:07:15

标签: actionscript-3 oop inheritance superclass

我有这个:

public class Base {
    public function whoAmI() {
        trace("base");
    }
}

public class Extended extends Base {

    public function Extended() {
        this.whoAmI() //prints extended
        super.whoAmI() //prints base

        var test = super;
        test.whoAmI() //prints extended
    }

    public override function whoAmI() {
        trace("extended");
    }
}

问题是当我var test = super时,似乎this被分配到测试而不是super

是否可以进行分配,以便test.whoAmI()打印" base"?

编辑:在评论中,据说以我提议的方式使用super会打破覆盖。我认为并非如此。我想到的方式,super可以像this一样使用。我知道这不是超级实现的方式,但以这种方式使用它不会像人们声称的那样打破压倒一切。因此,例如,这是可能的:

var test = this;
test.whoAmI();

这应该是可能的:

var test = super;
super.whoAmI();

显然,语言实施者选择不以这种方式做事,我不明白其原因。它并没有破坏事物,但我想这确实会使它们变得更加复杂。

建议this类的类型转换super。显然那不会起作用。

4 个答案:

答案 0 :(得分:0)

不,这是不可能的。

如果这是可能的话,那么覆盖方法是不可能的!

例如,采取此功能......

public function test(a:Object):void {
    trace(a.toString());
}

如果你的想法是如何运作的话,你只会得到[object Object]

答案 1 :(得分:0)

好的,我明白你的意思,你的问题更多是关于语言定义和规范。

请看一下c#中的这个例子,它解释了如何在c#中更准确地管理覆盖:

http://www.dotnet-tricks.com/Tutorial/csharp/U33Y020413-Understanding-virtual,-override-and-new-keyword-in-C

但是 让我们解释一下它是如何运作的。

当你扩展一个类时,如果你创建一个由继承树中的所有对象组成的对象,那么如果B extends AC extends B你有两个这样的对象:< / p>

(B + A)和(C + B + A)具有彼此之间的层次B-> A和C-> B-> A。超级只是一种在层次结构中提升的方式。

例如,当你在A中施放C时。在内存中,你总是有一个对象(C + B + A)但是被解释为A.当你覆盖时,你只要说一个子方法中的方法优先于父方法。

答案 2 :(得分:0)

你在考虑&#34;这个&#34;和&#34;超级&#34;作为2个不同的实例,2个不同的东西,但它们实际上指向同一个对象(显然),所以最后总是&#34;这个&#34;。使用super只是一个特殊的关键字,允许实例指向继承链上的覆盖定义,它不指向不同的对象。所以&#34;超级&#34;它正确地完成了它的工作,它指向实例,并允许您每次使用它来访问覆盖的定义,以及它。当然,尝试将该关键字存储在变量中没有意义,因为在这种情况下,它只是正确地返回它指向的实例,它总是&#34;这个&#34;。 它只是一个被误解的继承原则的例子,我以前见过它,super被误认为某种实例包装了围绕对象的继承链&#34;这个&#34;事实上,它实际上始终是同一个对象。

答案 3 :(得分:0)

您可以尝试向您的任何班级的前辈手动向下转发this。指针仍然等于this,但调用的方法将使用用于向下转换的类的类表。

public class Extended extends Base {

    public function Extended() {
        this.whoAmI() //prints extended
        super.whoAmI() //prints base

        var test:Base = this;
        test.whoAmI() //should print base
    }

    public override function whoAmI() {
        trace("extended");
    }
}

如果您的Base扩展了某些内容,哪些方法已知为,则超类为dynamic,并且有代码可以向类的prototype添加方法,您可以使用这样的向下转换来调用在编译时可能不存在的超类的方法,但请确保在动态类的情况下首先调用hasOwnProperty以确定方法或属性是否存在。