Получить ссылку на метод экземпляра AS3 из объекта Class - PullRequest
6 голосов
/ 23 мая 2011
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-эквивалент того, что я хочу сделать:

Method m = Foo.class.getMethod("bar", ...);
m.invoke(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);
    }
}

Ответы [ 4 ]

2 голосов
/ 23 мая 2011

Здесь функциональная панель существует только тогда, когда ваш класс создан:

var foo:Foo = new Foo()
var fun:Function = foo.bar // <-- here you can get the function from the new instance

если вы хотите получить прямой доступ к нему, вы должны сделать его статическим:

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

теперь вы можете получить доступ к своей функции из класса Foo:

var fun:Function = Foo.bar

или

var clazz:Class = Foo
var fun:Function = clazz["bar"]
1 голос
/ 23 мая 2011

Я не уверен в том, что вы намереваетесь делать.

Однако AS3Commons , особенно в отражающем пакете, есть API, которые позволяют вам работать с методами, экземплярами и свойствами класса.

Существуют также методы API для создания экземпляров определенных типов классов на лету и вызова их соответствующих методов.

Приветствия

0 голосов
/ 25 мая 2011

Мой обходной путь - сохранить имя функции вместо объекта Function.

var fun:String = "bar";

// later...
new Foo()[fun](...);
0 голосов
/ 23 мая 2011

Это не

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

Используйте вместо этого, поскольку для функции не требуется никаких параметров

fun.call(clazz);

Первый параметр, указанный в Adobe Docs.Объект, который указывает значение thisObject в теле функции.

[РЕДАКТИРОВАТЬ]Забыл указать, что вам нужно создать экземпляр нестатического класса с ключевым словом "new".

var clazz:Class = new Foo();

[EDIT2]Хорошо, я играл и думаю, что получил то, что вы хотите.

base.as

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( );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...