繁体   English   中英

在类as3中动态创建函数

[英]Dynamically create function in class as3

我基本上想做的是在实例化类后在类中动态创建函数...我真的不知道是否有可能在as3中实现这一点...下面是一些示例:

    var mc:SomeClass = new SomeClass();
    mc["myMethod"] = function():void {};

要么

    public function SomeClass()
    {
    }

    public function addMethod(methName:String, func:Function):void
    {
        pushMeth(func);
        this[methName] = getMeth();
    }

两个例子都是一样的...

    mc["myMethod"] = function():void {};

要么

    this[methName] = getMeth();

抛出:
ReferenceError:错误#1056:无法在SomeClass上创建属性myMethod

因此,您能否给出任何建议,如何实现此目标,或者代码中存在什么问题,或者完全可以实现此效果?

编辑!!!
@null的完整工作代码

    public dynamic class OverloadExample
    {
        private var _meths:Object = {};
        public function OverloadExample()
        {
        }

        public function addMethod(methName:String, func:Function):void
        {
            pushMeth(func);
            this[methName] = getMeth;
        }

        private function pushMeth(func:Function):void
        {
            _meths[func.length] = func;
        }

        private function getMeth(...args):void
        {
            var l:int = args.length;
            if (_meths[l]) {
                _meths[l].apply(this,args);
            }
        }
    }


    var o:OverloadExample = new OverloadExample();
    o.addMethod("mm", function(a:int):void { trace("one"); } );
    o.addMethod("mm", function(a:int,b:int):void { trace("two"); } );
    o.mm(1);
    o.mm(2,3);


注意:这仅是如何实现过载效果的示例...
现在,我试图使用相同数量的参数来添加两个或多个函数,但是此参数可以是不同的类型,并且我有一些改进...

SomeClass应该是动态的。

public dynamic class SomeClass {

动态类定义了一个可以在运行时通过添加或更改属性和方法来更改的对象。

您可以创建一个包含Function的属性。 公共类SomeClass {

private var functions:Object = {};

public function SomeClass()
{
}

public function addFunction(name:String, function:Function):void
{
    functions[name] = function;
}

}

这样做的好处是不必使类成为dynamic类,这是非常不希望的,因为动态类在编译时很难进行错误检查。

您仍然应该进行真实性检查。

将此与EventDispatcher类进行比较,该类使您无需dynamic就可以向其添加“方法”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM