вызов super () из конструктора actionscript с использованием varargs - PullRequest
2 голосов
/ 09 февраля 2010

Если конструктор принимает свои параметры как vararg (...), кажется, невозможно создать подкласс, который просто передаст этот vararg суперклассу.

Есть связанный вопрос с исправлением для этой же ситуации для обычных функций: Оборачивание метода Vararg в ActionScipt , но я не могу заставить его работать с супер-вызовом.

Базовый класс:

public class Bla
{
    public function Bla(...rest)
    {
        trace(rest[0]); // trace the first parameter
    }

}

подкласс:

public class Blie extends Bla
{
    public function Blie(...rest)
    {
        // this is not working, it will 
        // pass an array containing all 
        // parameters as the first parameters
        super(rest); 
    }

}

если я сейчас позвоню

        var b1 = new Bla('d', 'e');
        var b2 = new Blie('a', 'b', 'c');

Я получаю вывод

d
a,b,c

И я хочу, чтобы он распечатал:

d
a

Помимо фактического переноса обработки параметров в подкласс или переключения его на отдельный метод инициализатора, кто-нибудь знает, как правильно сделать супер-вызов?

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

К сожалению, нет способа вызвать суперпроектор с ... args. Если вы удалите вызов super(), он будет вызван компилятором (без аргументов). arguments также недоступен для конструкторов.

Если вы можете изменить сигнатуры метода, вы измените аргументы так, чтобы они принимали Array вместо ... args. В противном случае, как вы упомянули, вы можете переместить его в метод инициализатора.

0 голосов
/ 18 июля 2013

Вы можете использовать следующее утверждение:

override public function doSomething(arg1:Object, ...args):void {
  switch(args.length) {
    case 0: super.doSomething(arg1); return;
    case 1: super.doSomething(arg1, args[0]); return;
    case 2: super.doSomething(arg1, args[0], args[1]); return;
  }
}
...