假设我们有超类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();
答案 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
功能可能更容易(或者如果您发现自己需要从外部调用此方法,请将其分解一个专门的功能,它被视为任何其他公共功能)