2015-01-03 40 views
1

比方说,我们有超A和子类B:AS3:调用超类方法而不是子类实例的覆盖?

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

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

超类有一个所谓的F方法,和子类B有对于f覆盖。现在我有B类的一个实例:

var b:B = new B(); 

是无法调用B的的F超类版本,通过执行类似b.super.f()?没有为B显式调用super.f();

回答

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 

周围有点磕磕绊绊之后,我碰到这个来得如此回答(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另一种方法。

总之,要得到它的工作/缺点:

  • 你需要让你的类动态(因此更大,并且能够增加你想要什么PARAM)
  • 您需要破解的声明函数本身的
  • 您需要访问一个基类对象Function(虽然你可以叫(new A).foo
  • 你没有得到代码完成

总而言之,在B上创建一个方法来公开A的功能(或者如果您发现自己需要从外部调用该功能,只需将其分解为专用功能,并将其与其他任何公共对象func)

相关问题