AS3:调用超类方法而不是子类实例的重写?

AS3: Calling superclass method instead of subclass instance's override?

假设我们有 superclass A 和 subclass B:

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

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

Superclass A 有一个名为 f 的方法,而 subclass B 有一个 f 的覆盖方法。现在我有一个 class B:

的实例
var b:B = new B();

是否不可能通过 b.super.f() 之类的操作来调用 f 的 b 的超级 class 版本?没有为 B 编写显式调用 super.f();

的方法

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

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

...
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 来解决这个问题。您只需要像这样声明您的 class:

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

注意 class 上的函数声明样式和 dynamic 属性。 foo() 函数不会在创建时绑定,因此您可以这样调用它:

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

即使 B 声明了另一个名为 foo 的方法,这仍然有效。

简而言之,要达到 work/downsides:

  • 你需要使你的 classes 动态化(因此更大,并且能够添加你想要的任何参数)
  • 您需要破解函数本身的声明
  • 您需要访问基础 class Function 对象(尽管您可以调用 ( new A ).foo
  • 您没有完成代码

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