如何在 ActionScript 中重载函数?

Posted

技术标签:

【中文标题】如何在 ActionScript 中重载函数?【英文标题】:How can you overload a function in ActionScript? 【发布时间】:2011-11-19 23:14:51 【问题描述】:

我想要一个能够接受各种类型的函数。 AS3 不支持直接重载...所以我不能做以下事情:

//THIS ISN'T SUPPORTED BY AS3

function someFunction(xx:int, yy:int, someBoolean:Boolean = true)
    //blah blah blah

function someFunction(arr:Array, someBoolean:Boolean = true)
    someFunction(arr[0], arr[1], someBoolean);

我怎样才能解决它并且仍然拥有能够接受各种类型参数的函数?

【问题讨论】:

我相信你会得到你的答案,但我只是好奇你为什么要使用方法重载?我有时会达到某个点,这确实有助于解决一个快速的问题,但我认为这是不好的做法,所以我不这样做。 我同意马蒂亚斯的观点。没有对重载的本机支持,让函数接受可变参数是不好的做法(除非在与重载无关的非常非常特殊的情况下) 方法重载对于任何语言来说都是非常方便的补充。它会让像数学课这样的东西变得容易得多;不再有 multPoint()、multScalar() 等,你可以只拥有 mult() @divillysausages 酷。有什么好的例子吗? as3 并不真正支持它。我见过的最好的就是 zzzzBov 的回答:function mult( param:* ):void if (param is Point) this._multPoint(); else if (param is Number) this._multScalar(); 【参考方案1】:

如果你只是希望能够接受任何类型,你可以使用* 来允许任何类型:

function someFunction( xx:*, yy:*, flag:Boolean = true )

  if (xx is Number) 
    ...do stuff...
   else if (xx is String) 
    ...do stuff...
   else 
    ...do stuff...
  

如果您有大量不同的参数且顺序不重要,请使用选项对象:

function someFunction( options:Object )

  if (options.foo) doFoo();
  if (options.bar) doBar();
  baz = options.baz || 15;
  ...etc...

如果你有可变数量的参数,你可以使用... (rest) parameter:

function someFunction( ... args)

  switch (args.length)
  
    case 2:
      arr = args[0];
      someBool = args[1];
      xx = arr[0];
      yy = arr[1];
      break;
    case 3:
      xx = args[0];
      yy = args[1];
      someBool = args[2];
      break;
    default:
      throw ...whatever...
  
  ...do more stuff...

如果你需要调用多个类的通用函数,你应该指定每个类的通用接口:

function foo( bar:IBazable, flag:Boolean )

  ...do stuff...
  baz = bar.baz()
  ...do more stuff...

【讨论】:

作为 ECMAScript 变体,您可以使用same techniques as javascript【参考方案2】:

可能有:

function something(...args):void

    trace(args[0], args[1]);

这样您就可以轻松地遍历您的参数等(甚至检查参数类型):

function something(...args):void

    for each(var i:Object in args)
    
        trace(typeof(i) + ": " + i);
    


something("hello", 4, new Sprite()); // string: hello
                                     // number: 4
                                     // object: [object Sprite]

【讨论】:

以上是关于如何在 ActionScript 中重载函数?的主要内容,如果未能解决你的问题,请参考以下文章

仅返回类型不同的函数,在C++中如何实现重载?

在c++中的继承,如何在子类中重载成员函数

如何在 TypeScript 中实现的接口中进行构造函数重载?

如何从 PHP 扩展中重载函数?

如何实现JS函数的重载

如何在 JavaScript ECMA6 中重载构造函数? [复制]