【问题标题】:AS3: Calling superclass method instead of subclass instance's override?AS3:调用超类方法而不是子类实例的覆盖?
【发布时间】:2015-03-01 19:52:41
【问题描述】:

假设我们有超类 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 的超类版本的 f,通过 b.super.f() 之类的操作?无需为 B 编写显式调用 super.f() 的方法;

【问题讨论】:

    标签: actionscript-3 inheritance overriding subclass superclass


    【解决方案1】:

    简答:有点,但不好玩

    长答案:我最初认为可以使用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 功能可能更容易(或者,如果您发现自己需要从外部调用它,只需将其拆分为一个专用函数,在那里处理它像任何其他公共功能一样)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2013-07-07
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多