2014-01-11 1 views
1

Я недавно изучал ООП и решил перенести этот сдвиг в эту парадигму (это нелегко ... во ВСЕХ) и в попытке найти некоторые из его понятий. У меня есть бит проблемы, наследующей от класса Array в ActionScript 3.0 (не то, что я пробовал в AS 2.0) ... вздох. Во всяком случае я пытаюсь вызвать родительский конструктор для создания экземпляра в ... аргументы покоя из класса ребенка, как такРасширить класс Array в AS3

public class CustomArray extends Array{ 

    public function CustomArray(...rest):void { 
     super(rest); 
    } 
} 

И я получаю эту ошибку с выхода ...

ReferenceError: Error #1056: Cannot create property 0 on classes.CustomArray. 

... к моему полному разочарованию :(.

Я, очевидно, делаю что-то неправильно, но для любви ко мне не могу показаться, чтобы выяснить, что это такое. на самом деле нуждается в помощи. Спасибо.

ответ

1

К сожалению, в AS3 вы не можете вызвать super конструктор и передать ему параметры в Function::apply стиле, так что в вашем массиве Array реализации с length=1 и одного элемента (переданного rest параметра с типом массива) всегда будет создана. Если вы хотите реализовать AS3 по умолчанию Arrayconstructor behavior:

Array Constructor 
public function Array(... values) 

Parameters 
    ... values — A comma-separated list of one or more arbitrary values. 

Note: If only a single numeric parameter is passed to the Array constructor, 
it is assumed to specify the array's length property. 

Вы должны добавить некоторый код в конструкторе CustomArray:

public dynamic class CustomArray extends Array 
{ 
    public function CustomArray(...rest) 
    { 
     super(); 

     var i:int, len:int; 
     if(rest.length == 1) 
     { 
      len = rest[0]; 
      for (i = 0; i < len; i++) 
       this[i] = ""; 
     } 
     else 
     { 
      len = rest.length; 
      for (i = 0; i < len; i++) 
       this[i] = rest[i]; 
     } 
    } 
} 

Также не забудьте сделать этот класс dynamic.

+0

Большое спасибо за добавленное объяснение. – Cozzbie

1

декабрь Я считаю этот класс динамичным. Также конструктор - это метод, который не указывает тип возвращаемого значения, удаляет :void из его декларации.

+0

Большое спасибо. Это помогло – Cozzbie

1

Жаль воскресить эту «старую» нить. Я был вынужден улучшить конструктор, предложенный fsbmain.

При вызове нового массива («foo») создается объект Array, содержащий строку «foo» - ["foo"]. Поэтому я думаю, что пользовательский конструктор должен учитывать эту возможность (только один параметр, который не является числом).

Вот код, который я предлагаю:

package { 
    public dynamic class MyArray extends Array { 
     public function MyArray(...rest) { 

     // super(); 

     // I think super() is not mandatory here since 
     // we are basically replacing the constructor... 

      var i: int, len: int; 
      if (rest.length == 1) { 
       if(rest[0] is Number){ 
        len = rest[0]; 
        for (i = 0; i < len; i++) { 
         this[i] = null; // empty values must be null, not "" 
        } 
       }else{ 
        this[0]=rest[0]; 
       } 
      } else { 
       len = rest.length; 
       for (i = 0; i < len; i++) { 
        this[i] = rest[i]; 
       } 
      } 
     } 
    } 
}