2013-11-24 54 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

相关问题