2014-01-11 121 views
1

我最近一直在學習OOP,並決定採用這種模式轉換(它不是那麼容易...在所有),並嘗試它的一些概念我有一個從ActionScript 3.0中的Array類繼承的問題(不是我曾在AS 2.0中嘗試過)......感嘆。反正我想調用父類的構造從子類中實例化...其餘參數,像這樣在AS3中擴展Array類

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構造,並在您Array實現陣列length=1和一個元素(通過rest參數與陣列的類型)傳遞參數給它Function::apply風格,所以總是會被創建。 如果你想實現的默認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提出的構造函數。

當我們調用new Array(「foo」)時,會創建一個包含String「foo」 - [「foo」]的Array對象。所以我認爲自定義構造函數必須考慮到這種可能性(只有一個參數不是數字)。

這是我提出的代碼:

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