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)
假设我们有 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)