Flash 静态常量错误[闪存]

Flash 静态常量错误[闪存],flash,static,constants,Flash,Static,Constants,参考静态常数时,会出现错误: 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(

参考静态常数时,会出现错误:

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);
    }
}
石块等级:

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

请告诉我如何消除此错误?

不确定您想做什么

你不能这样做吗

public static const BEDROCK_ID:int = 1;

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

trace(Block.STONE, Block.STONE.id);
或者类似的东西。从技术上讲,它应该按原样工作,但可能有一些种族条件涉及到什么类是先建造的(块或石头块)

编辑

我想得越多,我就越确信这是竞争条件,运行时试图在构造块类时构造StoneBlock类(即,它还没有构造),但StoneBlock要求块在构造时存在。不幸的是,看起来您必须将常量重做到getter中,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;
}

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

我想在游戏中如何做MineCraft:public static final Block STONE=(新BlockStone(1,1)).c(1.5F).b(10.0F).a(h).a(“STONE”);您不应该将代码建立在模糊和反编译代码的基础上。如果没有上下文,您在上面的注释中显示的代码毫无意义。好的,您的选择不合适。我需要存储对象类,而不是它们的ID。我需要知道错误的原因。谢谢你的澄清。我决定做不同的事情:
公共静态函数init():void{…STONE=newstoneblock(1);…}