2013-11-24 74 views
0

所以我有這個超類的網格類和一個名爲GrassTile1,GrassTile2等的網格類的子類...所有子類的實例都存儲在一個數組中。我想如何將子類的實例轉換爲引用該數組的超類?如何將子類的實例轉換爲其超類?

private var backgroundGrid = []; //the array which the grids are stored in, in the main class. 



public class Grid extends MovieClip 
{ 

    protected var node :PathfindNode; //the variable I wish to access, from an instance of subclass. 

    public function Grid(){ 
     node = new PathfindNode(); 
    } 


} 



public class GrassTile1 extends Grid { //every subclass of Grid will extends Grid 


    public function GrassTile1() { 
     // constructor code 
    } 
} 

function getBackgroundGrid(i:int,j:int):Grid{ //in the main class 
     return Grid(backgroundGrid[i][j]); // this line gives me an error 
    } 

類型錯誤:錯誤#1034:類型強制失敗:無法轉換GrassTile1 @ 2905d5f1網格。

我試過訪問backgroundGrid [i] [j] .node和其他方法來解決,我可以想到和失敗。任何想法?

+0

我建立了一個簡單的.fla文件,並設置了這個文件,因爲我假設你基於你所說的做了什麼,而且我沒有錯誤。 – prototypical

+0

查看我更新的答案。如果你在構造函數中拋出一個跟蹤來確保你期望發生的事情實際上正在發生,那將會很好。我不需要叫超級,它對我來說工作得很好。 – prototypical

回答

0

嘗試:

return backgroundGrid[i][j] as Grid; 

個人,Grid似乎是一個糟糕的類名來使用。我認爲Tile更有意義,因爲GrassTile1不是邏輯上理解網格的網格。一個網格可能包含一組瓦片,因此聽起來不合邏輯地將其用作瓦片的類名稱。

此外,您實際調用getBackgroundGrid方法的線在哪裏?你應該嘗試在那裏投射,而不是用那種方法。我相信會解決問題。

我無法驗證引發錯誤的行,所以我們假設它是return語句。但是,它可能位於調用getBackgroundGrid的另一邊。

更新:我試過一個.fla使用你所描述的,它工作得很好,我沒有錯誤。這就是爲什麼我認爲我們在這裏錯過了一些東西,也許這個類的定義沒有被使用。你可以在你的構造函數中添加一條痕跡來驗證你期望的實際發生了什麼?

+0

我試過了,但它沒有解決問題。順便說一句,isnt返回Grid(backgroundGrid [i] [j])並返回backgroundGrid [i] [j]作爲Grid同樣的事情?感謝您的幫助。我通過確保所有子類在構造函數中調用super()並將子類和超類放入同一文件來解決此問題。 –

+0

你沒有向我們展示真正的代碼中的數組,你只是在這裏給我們片段,所以我擔心有些事情我們不能在這裏評估。庫中是否有名爲GrassTile1的實例?如果是這樣,那麼它會自動創建一個類。如果你的類沒有正確實現,那可能導致它不像你期望的那樣擴展Grid。 – prototypical

+0

http://stackoverflow.com/questions/14268329/as3-cast-or-as - 我傾向於使用'as',只是好奇,如果它有所作爲。我們正在努力實現的目標應該沒有什麼不同。 – prototypical

相關問題