如何“通过”方法传递任意一组参数?

我正在使用 AIR v32.0。我有一个扩展 netConnection 的类。我需要覆盖接收任意一组参数的现有方法。我需要做一些零碎的事情,然后让原始代码处理剩下的事情。我了解如何接收参数“...参数”,但我在完成后找不到调用原始代码的正确方法。

到目前为止,我所拥有的不起作用的是;

public override function call(strCommand:String, rspResponder:Responder,...parameters):void
{
    trace("parameters.length=" + parameters.length)
    if (parameters.length == 0)
    {
        super.call(strCommand, rspResponder);
    }
    else
    {
        super.call(strCommand, rspResponder, parameters);
    }
}

线;

super.call(strCommand, rspResponder);

按预期工作。

线;

super.call(strCommand, rspResponder, 参数);

似乎没有被“调用”方法正确处理。

如何将“...参数”正确传递给 netConnection 类的“super.call”方法?

编辑:

本身没有错误。发生的情况是它以网络服务不期望的格式向 FluorineFX 网络服务发送消息,然后 Ralphs 在其鞋子上。错误是“处理级别错误描述找不到名称为 LoginCheck 的合适方法”如果我删除覆盖的方法一切正常。

当我在 Fiddler 中查看输出结果时,在使用 & 而不使用覆盖方法运行它时,某些不可打印的字符存在差异。但我无法确定实际差异是什么。

附加编辑:

我有一个非常糟糕的部分工作(至少它有效),也许这会激发某人的想象力。我会不好意思把它投入生产。

public override function call(strCommand:String, rspResponder:Responder,...parameters):void
{
    trace("parameters.length=" + parameters.length)
    switch (parameters.length)
    {
        case 0:
            super.call(strCommand, rspResponder);
            break;
        case 1:
            super.call(strCommand, rspResponder, parameters[0]);
            break;
        case 2:
            super.call(strCommand, rspResponder, parameters[0], parameters[1]);
            break;
        case 3:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2]);
            break;
        case 4:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3]);
            break;
        case 5:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4]);
            break;
        case 6:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], 
                                                 parameters[5]);
            break;
        case 7:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4],
                                                 parameters[5], parameters[6]);
            break;
        case 8:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], 
                                                 parameters[5], parameters[6], parameters[7]);
            break;
        case 9:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], 
                                                 parameters[5], parameters[6], parameters[7], parameters[8]);
            break;
        case 10:
            super.call(strCommand, rspResponder, parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], 
                                                 parameters[5], parameters[6], parameters[7], parameters[8], parameters[9]);
            break;
    }
}

回答

要传递以Array形式出现的额外...arguments,您需要以特殊的Function.apply(...)方式调用该方法。问题是,一个函数AS3(或者也许ECMA一般标准)是一个对象也因此有一些自己的属性和方法,其中,在某些情况下,允许执行一些怪异的招数。

public override function call(strCommand:String, rspResponder:Responder, ...parameters:Array):void
{
    trace("parameters.length=" + parameters.length);
    
    // Create a single deflated Array of incoming arguments.
    var args:Array = [strCommand, rspResponder].concat(parameters);
    
    // A special way of invoking a function where you provide
    // all its arguments in a form of a single Array.
    super.call.apply(this, args);
}

请记住,我没有测试过。另外,我从未尝试过apply(...)覆盖,但理论上应该没有问题,我想?


以上是如何“通过”方法传递任意一组参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>