Actionscript 3 ActionScript:确定超类是否实现特定接口?

Actionscript 3 ActionScript:确定超类是否实现特定接口?,actionscript-3,Actionscript 3,是否有任何非黑客的方法来确定类的超类是否实现了特定的接口 例如,假设我有: class A extends EventDispatcher implements StuffHolder { protected function get myStuff():Stuff { ... }; public function getStuff():Array { if (super is StuffHolder) // <<< this doesn't

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

例如,假设我有:

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 { ... };
}
class A扩展了EventDispatcher实现了StuffHolder{
受保护函数get myStuff():Stuff{…};
公共函数getStuff():数组{

如果(super是StuffHolder)/在这种情况下,您可能必须将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();
  }
 }
}

我还没有完全弄清楚为什么需要这种(奇怪的,可能被破坏的)继承,但是你能把它改成if(这实际上是一个实例)吗

如果是这样,你可以和

import flash.utils.getQualifiedClassName;

if (getQualifiedClassName(this) == 'A')
问题是,is操作符应该用在对象实例上,它一直到对象都有效——我的意思是,A is B对于每个A祖先或接口实现都是真的

不过,我认为你可以为你的课程设计一个更好的结构。
这并不是那么漂亮。

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

如果你尝试将其转换为StuffHolder而不是检查呢?类似于if(super as StuffHolder)之类的事情)不,不爱-
super
似乎太神奇了。如果EventDispatcher实现了StuffHolder,你将无法在没有A的getStuff的“覆盖”修饰符的情况下编译它。这意味着super无论如何都会有它。继承在编译时被检查,不是吗?为什么你不知道父级是否实现了一些类?@Kishi:因为
getStuff
可以在
A
B
上调用。如果在
B
上调用它,它应该调用
super.getStuff()
,但是如果在
A
上调用它,它不应该调用
super.getStuff()
。事情不是这样的。方法的实现总是在实现类的上下文中。在a中,super总是作用于a的超类。而且,代码对我来说真的没有什么意义。你到底想实现什么?这里的问题是,你不能用AS3进行多重继承,我认为是这样的这篇文章可能也会对你有所帮助。祝你好运!是的,这就是问题所在。在我的例子中,
getStuff
函数实际上是一个mixin,它是通过一个
include“…”实现的
,所以我不想更改我正在扩展的东西的超类。正如我在Sandro的评论中提到的,我的
getStuff
函数实际上是一个mixin,它被
包含“…”
'd,所以它甚至不知道它在哪个类上。它唯一知道的是它所应用的类已经实现了
StuffHolder
interface.Omg..它变得更丑了。好吧。那么..是“if(super.foo!=null)super.foo()”够了?或者你需要知道它是否真的实现了StuffHolder吗?如果是的话…反射。“DescripteType(getDefinitionByName(getQualifiedSuperclassName(this))”将返回超类(例如,在A类中为EventDispatcher)XML描述。它将有一个“”标记,其中包含它实现的接口列表。。。