Actionscript 3 从类对象获取AS3实例方法引用

Actionscript 3 从类对象获取AS3实例方法引用,actionscript-3,function,reflection,function-pointers,Actionscript 3,Function,Reflection,Function Pointers,执行上述操作的正确方法是什么?我想做的Java等价物是: class Foo { public function bar():void { ... } } var clazz:Class = Foo; // ...enter the function (no Foo literal here) var fun:Function = clazz["bar"]; // PROBLEM: returns null // later fun.call(new Foo(), ...); 实

执行上述操作的正确方法是什么?我想做的Java等价物是:

class Foo {
   public function bar():void { ... }
}

var clazz:Class = Foo;

// ...enter the function (no Foo literal here)
var fun:Function = clazz["bar"]; // PROBLEM: returns null

// later
fun.call(new Foo(), ...);

实际代码(带变通方法):


此处,功能栏仅在类实例化时存在:

class SerClass {

    public var className:String;
    public var name:String;
    private var ser:String = null;
    private var unser:Function = null;

    public function SerClass(clazz:Class):void {

        var type:XML = describeType(clazz);

        className = type.@name;

        // determine name
        name = type.factory.metadata.(@name=="CompactType").arg.(@key=="name").@value;

        // find unserializer
        var mdesc:XML = XML(type.method.metadata.(@name=="Unserialize")).parent();
        if (mdesc is XML) {
            unser = clazz[mdesc.@name];
        }

        // find serializer
        var sdesc:XML = XML(type.factory.method.metadata.(@name=="Serialize")).parent();
        if (sdesc is XML) {
            ser = sdesc.@name;
        }


    }
    public function serialize(obj:Object, ous:ByteArray):void {
        if (ser == null) throw new Error(name + " is not serializable");
        obj[ser](ous);
    }
    public function unserialize(ins:ByteArray):Object {
        if (unser == null) throw new Error(name + " is not unserializable");
        return unser.call(null, ins);
    }
}
现在,您可以从类Foo访问您的函数:

class Foo {
 public static function bar():void{ ... }
}


我不确定你打算做什么

但是,特别是reflect包有API,允许您使用类的方法、实例和属性

还有一些API方法可以动态创建某些类类型的实例并调用它们各自的方法

干杯

不是

var clazz:Class = Foo
var fun:Function = clazz["bar"]
由于函数不需要任何参数,请改用

 fun.call(new Foo(), ...);
adobe docs指定的第一个参数。
在函数体中指定此对象值的对象


[编辑]
忘了指出您必须用“new”关键字实例化一个非静态类。

fun.call(clazz);
[EDIT2]
好吧,我到处玩,觉得我得到了你想要的。

base.as

var clazz:Class = new Foo();

我的解决方法是存储函数名,而不是
函数
对象

package{
  public class Base {
    public function Base() {
      trace('Base constructor')
    }
    public function someFunc( ){
      trace('worked');
    }
  }
}



//called with 
var b:Base = new Base( );// note I am not type casting to Class
var func:Function = b.someFunc;
func.call( );


如果您执行var-fun:Function=Foo[“bar”]?我想也是这样。我无论如何不能那样做
clazz
是函数的一个参数。如前所述,在实例化Foo之前,无法访问方法栏。也许你应该发布你真正想做的事情?@Patrick:我想获取一个类的实例方法的引用,然后在该类的随机(外部创建的)实例上调用它。@Bart这是不可能的。我问了两位这个星球上最出色的开发者,他们证实:我没有,也不能在阅读
Foo
bar
函数时创建
Foo
的实例。杆也正确地不是静态的。在最后一行中,我用一个
Foo
实例调用它,作为
this
。函数不是静态的,因此
this
应该是一个实例,而不是类。var clazz:class=Foo;这是一个例子。第一个参数是要在其上运行函数的实例。在你的问题中,你问什么是做这件事的正确方法,我给你贴了。你没有提到静电。你想要静电的吗?如果是这样,则将该方法声明为静态。在另一条注释中,您说:“我想获取对类的实例方法的引用,然后在该类的随机(外部创建的)实例上调用它。”然后,您就是这样做的。在您的注释中,clazz不是Foo的实例,而是class的实例(它描述了类Foo)啊,不知道我怎么会错过。您试图做的不是OOP标准实践。要调用非静态对象的方法,您需要了解该对象。你想要的是像有一个按钮的点击功能,但不知道它属于哪个按钮。我所知道的做您想要的事情的唯一方法是使该类成为静态的,这样该类就只有一个实例。无论如何,您应该存储对类对象的引用,而不是对函数的引用。您可能需要重新考虑此项目的设计模式。我希望获得对类的实例方法的引用,然后在该类的随机(外部创建)实例上调用它。在其他注释中的所有讨论中,我几乎忘记了这个答案。我去看看那个图书馆。看起来它可以让我的工作代码变得更好。这就是我昨天说的,你必须实例化这个类才能调用这个方法;)@Patrick:我在一个实例上调用这个方法,正如我在问题和一些评论中解释的那样。谢谢你的帮助,但我想你只是不明白我需要做什么,我无法进一步解释。现在接受这个解决方案。看起来这是不可能的,或者没有人知道怎么做。我很乐意接受正确的答案,除非它是静态的。这不是一个解决问题的方法。@The_asMan:因为我已经对大多数答案和注释进行了评论,所以当我调用该方法时,我有一个实例。这就是上面的
新Foo()
。我只是不知道什么是正确的方法。
fun.call(clazz);
var clazz:Class = new Foo();
package{
  public class Base {
    public function Base() {
      trace('Base constructor')
    }
    public function someFunc( ){
      trace('worked');
    }
  }
}



//called with 
var b:Base = new Base( );// note I am not type casting to Class
var func:Function = b.someFunc;
func.call( );
var fun:String = "bar";

// later...
new Foo()[fun](...);