AS3:调用超类方法而不是子类实例覆盖?

时间:2015-01-03 21:43:12

标签: actionscript-3 inheritance override subclass superclass

假设我们有超类A和子类B:

public class A {
    public function f() {...}
}

public class B extends A {
    override public function f() {...}
}

超类A有一个叫f的方法,子类B有一个f的覆盖。现在我有一个B类实例:

var b:B = new B();

通过像b.super.f()那样调用b的超类f是不可能的?无需为B显式调用super.f();

1 个答案:

答案 0 :(得分:0)

简短回答:有点,但这并不好玩

答案很长:我原本以为可以使用Function对象和apply()call(),但即使文档(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Function.html#apply())说你可以传递另一个对象,它不起作用,它总是绑定到声明的类。

...
public function foo():void
{
    trace( this );
}
...

var func:Function = a.foo;
func.apply( b ); // traces a

稍微磕磕绊绊之后,我遇到了这个SO答案(Function.apply not using thisArg parameter),这解释了为什么这不起作用(tldr;它是因为方法在创建时绑定到它们的实例) )。

虽然可以使用prototype来解决这个问题。你只需要像这样声明你的类:

public dynamic class A 
{
    prototype.foo = function():void
    {
        trace( this );
    }       
}

注意函数声明样式和类的dynamic属性。 foo()函数不会受到创建约束,因此您可以将其称为:

var func:Function = a.foo;
func.apply( a ); // traces a
func.apply( b ); // traces b

即使B声明另一个名为foo的方法。

,这也有效

简而言之,要让它发挥作用/缺点:

  • 您需要让您的课程充满活力(因此更大,并且能够添加您想要的任何参数)
  • 你需要破解函数本身的声明
  • 您需要访问基类Function对象(尽管您可以调用( new A ).foo
  • 您无法完成代码

总而言之,在B上创建方法以展示A功能可能更容易(或者如果您发现自己需要从外部调用此方法,请将其分解一个专门的功能,它被视为任何其他公共功能)

相关问题