【问题标题】:How do one cast a instance of subclass to its superclass?如何将子类的实例转换为其超类?
【发布时间】:2013-11-24 15:02:47
【问题描述】:

所以我有这个超类网格类,以及名为 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 
    }

TypeError:错误 #1034:类型强制失败:无法将 GrassTile1@2905d5f1 转换为 Grid。

我已尝试访问 backgroundGrid[i][j].node 和其他我能想到的解决方法,但都失败了。有什么想法吗?

【问题讨论】:

  • 我设置了一个简单的 .fla 并设置了文件,因为我假设你根据你所说的做了,我没有出错。
  • 查看我的更新答案。如果您在构造函数中进行跟踪以确保您期望发生的事情实际上正在发生,那就太好了。我不需要调用 super,它对我来说效果很好。

标签: actionscript-3 types subclass superclass coercion


【解决方案1】:

试试:

return backgroundGrid[i][j] as Grid;

就个人而言,Grid 似乎是一个不好用的类名。我认为Tile 更有意义,因为GrassTile1 不是网格,因为我在逻辑上理解网格。网格可能包含一组图块,因此将其用作图块的类名听起来不合逻辑。

另外,您实际调用 getBackgroundGrid 方法的行在哪里?您应该尝试在那里进行投射,而不是使用那种方法。我相信这会解决问题。

我无法验证引发错误的行,因此我们假设它是 return 语句。但是,它可能在您调用 getBackgroundGrid 的另一端。

更新:我已经使用您所描述的内容尝试了一个 .fla,它工作得很好,我没有收到任何错误。这就是为什么我认为我们在这里遗漏了一些东西,也许没有使用类的定义。你能在你的构造函数中添加一个跟踪来验证你所期望的实际发生了什么吗?

【讨论】:

  • 我试过了,但它并没有解决问题。顺便说一句,return Grid(backgroundGrid[i][j]) 和 return backgroundGrid[i][j] as Grid 不是一回事吗?感谢您尝试提供帮助。我已经通过确保所有子类在构造函数中调用 super() 并将子类和超类放在同一个文件中来解决这个问题。
  • 你没有用真实的代码向我们展示该数组中的内容,你只是在这里给我们提供了 sn-ps,所以我担心有些东西我们无法在这里评估。库中是否有一个名为 GrassTile1 的实例?如果是这样,那么它将自动创建一个类。如果你的类没有正确实现,那可能会导致它不能像你期望的那样扩展 Grid。
  • stackoverflow.com/questions/14268329/as3-cast-or-as - 我倾向于使用as,只是好奇它是否有所作为。我们试图实现的目标应该没有区别。
  • 如果是库符号,则需要在属性面板中将Grid设置为基类。我认为这可能是这里的核心问题。不确定它如何处理 .as 定义的类与自动创建的定义不同的情况。
  • 另外,您实际调用 getBackgroundGrid 方法的行在哪里?您应该尝试在那里进行投射,而不是使用那种方法。我相信这就是问题所在。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2023-04-10
相关资源
最近更新 更多