Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3可返回两种类型的方法的最佳实践_Flash_Actionscript 3_Types_Wildcard_Return Type - Fatal编程技术网

Flash AS3可返回两种类型的方法的最佳实践

Flash AS3可返回两种类型的方法的最佳实践,flash,actionscript-3,types,wildcard,return-type,Flash,Actionscript 3,Types,Wildcard,Return Type,我一直在为ActionScript3开发一个框架,遇到了一个特殊的场景,我希望一个方法能够返回一个AvFrameworkObject或一个Array,其中包含AvFrameworkObject的多个实例 采用此方法注册AvFrameworkObject的一个或多个实例: public function register(...objects):Object { var reg:Array = []; var i:AvFrameworkObject; for each(i

我一直在为ActionScript3开发一个框架,遇到了一个特殊的场景,我希望一个方法能够返回一个
AvFrameworkObject
或一个
Array
,其中包含
AvFrameworkObject
的多个实例

采用此方法注册
AvFrameworkObject
的一个或多个实例:

public function register(...objects):Object
{
    var reg:Array = [];

    var i:AvFrameworkObject;
    for each(i in objects)
    {
        i.fw = this;
        reg.push(i);
    }

    return reg.length > 1 ? reg : reg[0];
}
关于以上几点:

  • 这对我来说似乎太草率了。真的吗
  • 我还可以使用通配符(星号*)作为返回类型,这更有意义吗
  • 是否可以只定义两种返回类型?只是为了可读性等
  • 从某种严格意义上说,是的,这可能是草率的,但我见过更糟的

  • 您应该始终使返回类型尽可能窄。所以a*作为返回类型比Object更糟糕

  • 不,您不能有两种退货类型

  • 如果您对它有很好的测试,并且很好地记录了它,那么就可以使用它了


    但是你总是返回一个数组,如果只有一个结果,那么你返回一个大小为1的数组怎么样?

    在这种情况下,我会返回1项数组以保持一致性。这将形成一个更加合理的界面;调用方总是希望返回一个数组,而不必通过对不同的返回对象做出不同的响应使代码更加复杂

    现在还有一种情况,代码将以完全相同的方式响应返回的对象,无论其类型是什么,在这种情况下,这意味着返回的对象继承自某个公共基类。在这种情况下,返回类型应该是公共基类


    (我想我在这里假设您不会以完全相同的方式响应数组和AvFrameworkObject)

    据我所知,所有对象都被传递:

    在ActionScript 3.0中,所有参数都通过引用传递,因为所有值都存储为对象。但是,属于基本数据类型(包括Boolean、Number、int、uint和String)的对象具有特殊的运算符,这些运算符使它们的行为如同按值传递一样

    您不必返回任何内容,只需设置
    fw
    变量成员即可


    也就是说,您可以选择如何返回多个变量

    • 一种常见的方法是返回返回的数组的计数,并使用参数设置数组。调用类似于
      var length:int=register(out,object1,object2,object3)
      。然后可以在for循环中使用
      length
      变量
    • 另一种方法是返回整个数组。我认为不需要更多的解释,但我想说明的是,如果您需要特定的成员,可以直接使用返回的数组。例如,如果想要第一个对象,可以编写
      t:Thing=fw.register(newthing())[0]。注意结尾处的[0]
    • 您也可以使用上述方法,但使用
      对象
      代替
      数组
    我个人不喜欢返回抽象对象,通常我选择返回整个数组


    希望这能有所帮助。

    @Marty Wallace:甚至是返回向量。返回*和返回对象之间的区别是什么?返回一个长度为1的数组是我最初设置的方式,如果我使用var t:Thing=fw.register(new Thing()),看起来更干净;t、 property=“blah”;看看你的代码:我建议返回一个向量。毕竟-想象一下编写客户端代码,其中函数可能返回未知类型的对象。您必须在每次通话中检查其类型。乏味的最好每次都返回一个向量。仅仅因为它是一个包含一个成员的向量而返回第二种类型并不会给任何人带来麻烦。@1978年的《马克》检查这个问题:函数能够返回单个AvFrameworkObject的意义在于,我可以这样做:var obj:AvFrameworkObject=fw.register(new AvFrameworkObject());然后,如果我想一次注册多个实例,我可以,但是如果是这样的话,单个返回就没有意义了。也许我应该将函数拆分为register():AvFrameworkObject和registerMultiple():Array。你怎么认为?