Подтвердить что ты не робот

Как вы можете перегрузить функцию в ActionScript?

Я хочу, чтобы функция могла принимать различные типы. 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);
}

Как я могу обойти его и все еще иметь функцию, которая может принимать аргументы разных типов?

4b9b3361

Ответ 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):

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

Ответ 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]