2

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

Существует проблема с исправлением для этой же ситуации для обычных функций: Wrapping a Vararg Method in 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

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

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

+0

Хм, а не ответ, который я надеялся, но спасибо за подтверждение моих подозрений. –

0

Вы можете использовать заявление, как это:

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