你能覆盖AS3中的功能吗?

时间:2013-07-02 16:22:12

标签: actionscript-3 actionscript

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

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

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

AS不允许这样做吗?如果没有,除此之外还有另一种处理方法吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

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

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

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

这就是你在AS3中能做的最好的事情。至少严格来说,无法超载功能是一种相当普遍的抱怨和明显的语言缺陷。

答案 1 :(得分:1)

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

要解决此问题,您可以使用默认参数,或者只是减少参数约束。 This answer有一些细节。

你可以试试这个:

function init(var string:String = "Default value"):String{
  // do something 
}

答案 2 :(得分:1)

Actionscript不支持方法重载。但是,根据the answerthis question,您还有其他选择。

  

如果您只想接受任何类型,可以使用*   允许任何类型:

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...
}