1

引用静态常量,出现错误:

TypeError: Error #1009:
    at global$init()[StoneBlock.as:3]
    at Block$cinit()
    at global$init()[Block.as:3]
    at Main()[Main.as:10]

样本。

主类:

public class Main extends Sprite 
{
    public function Main()
    {
        trace(Block.STONE.id);
    }
}

块类:

public class Block 
{
    public static const BEDROCK:Block = new Block(1);
    public static const STONE:Block = new StoneBlock(2);

    public var id:int;

    public function Block(id:int)
    {
        this.id = id;
    }
}

石块类:

public class StoneBlock extends Block 
{
    public function StoneBlock(id:int) 
    {
        super(id);
    }
}

请告诉我如何摆脱这个错误?

4

2 回答 2

0

不确定您要做什么。

你不能这样做吗?

public static const BEDROCK_ID:int = 1;
于 2012-05-15T14:07:07.283 回答
0

我相信这是因为静态常量的绑定是在第一次提到该类时创建的。你可以尝试做:

trace(Block.STONE, Block.STONE.id);

或者类似的东西。从技术上讲,它应该按原样工作,但是在首先构造哪个类(Block 或 StoneBlock)时可能涉及一些竞争条件。

编辑

我想得越多,我就越相信这是竞态条件,运行时在构造 Block 类的同时尝试构造 StoneBlock 类(即尚未构造),但 StoneBlock 要求 Block 在其构造时存在。不幸的是,看起来您必须将常量重做为将根据请求返回值的 getter:

public static const STONE:Block = new StoneBlock(2);
>>>>>
private static var _stone:Block;
public static function get STONE():Block
{
    if (!_stone) _stone = new StoneBlock(2);
    return _stone;
}

因为通过这种方式,您将能够将依赖类的实例化推迟到它所依赖的类完全构建的时间。不是一个很好的解决方案,但看起来你没有太多选择。

于 2012-05-15T15:30:04.823 回答