如何“通过”方法传递任意一组参数?
我正在使用 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(...)覆盖,但理论上应该没有问题,我想?