ActionScript:确定更高级的超类是否实现了特定的接口?

时间:2010-04-08 17:06:12

标签: actionscript-3

是否有任何非hacky方法来确定类的超类是否实现了特定的接口?

例如,假设我有:

class A extends EventDispatcher implements StuffHolder {
    protected function get myStuff():Stuff { ... };

    public function getStuff():Array {
        if (super is StuffHolder) // <<< this doesn't work
            return super['getStuff']().concat([myStuf]);
        return [myStuff];
}

class B extends A {
    override protected function get myStuff():Stuff { ... };
}

我怎样才能以某种方式执行super is StuffHolder测试呢?在这种情况下,它始终返回true

3 个答案:

答案 0 :(得分:1)

在这种情况下,您可能必须将StuffHolder(并将其扩展EventDispatcher)定义为类,并将getStuff作为公共/受保护函数。然后,您可以在类A中重载getStuff函数,但不能在类B中重载。

package {
 public class StuffHolder extends EventDispatcher {
  function StuffHolder() {

  }
  protected function getStuff():Array{
   return ["Default"];
  }
 }
}
package {
 public class A extends StuffHolder {
  function A {
   super();
  }
  protected override function getStuff():Array {
   return ["A"];
  }
 }
}
package {
 public class B extends StuffHolder {
  function B {
   super();
  }
 }
}

答案 1 :(得分:1)

我没有完整的图片来弄清楚为什么你需要那种(奇怪的,可能已经破坏的)继承,但你能否将它改写为 if(这实际上是一个A实例)

如果是这样,你可以选择......

import flash.utils.getQualifiedClassName;

if (getQualifiedClassName(this) == 'A')

问题是,运算符应该用在对象实例上。并且它一直有效到对象 - 我的意思是, A是B 对于每个 A 祖先或接口实现都是正确的。

我认为你可以为你的课程提出一个更好的结构。 这不是那么漂亮。

答案 2 :(得分:0)

我可以做一些涉及内省的事情,获取当前的类,找到它的父类,然后检查是否实现了StuffHolder接口......但这看起来很难看:(