1

我是 ActionScripting 的新手,但我做过一些 Java。我被告知他们有点相似。我正在用一些集成的 AS3 编码我的 swf 文件。

function init():void{
  // do something
}

function init(var string:String):String{
  // do something else
}

这在 AS 中是不允许的吗?如果没有,除此之外还有其他处理方法吗?

提前致谢。

4

3 回答 3

5

是的,您可以覆盖函数。但是你给出的例子并不是压倒一切的——它是重载的。对于覆盖函数,您基本上只需创建一个具有相同签名和子类中所有内容的函数,并在它之前添加单词“覆盖”。

但是,您不能直接重载函数。如果您想要可变数量的参数,则必须使用可选参数。像这样:

function init(str:String = null):String
{
    if (str == null)
    {
        // do one thing
        return null;
    }
    else
    {
        // do another thing
        return "someString";
    }
}

这就是你在 AS3 中所能做到的最好的。至少严格来说,无法重载函数是一种相当普遍的抱怨和语言的明显缺点。

于 2013-07-02T16:28:53.917 回答
1

Actionscript 不支持方法重载。但是,根据对这个问题的回答,您还有其他选择。

如果您只想能够接受任何类型,则可以使用*to allow any type:

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) 参数

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...
}
于 2013-07-02T16:28:19.210 回答
1

你的意思是方法重载?可悲的是,Actionscript 不支持这一点。

为了解决这个问题,您可以使用默认参数,或者只是让您的参数少一些约束。 这个答案有一些细节。

你可以试试这个:

function init(var string:String = "Default value"):String{
  // do something 
}
于 2013-07-02T16:24:29.257 回答