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) で競合状態が発生する可能性があります。

編集

考えれば考えるほど、ランタイムがブロック クラスの構築中に StoneBlock クラスを構築しようとする (つまり、まだ構築されていない) 競合状態であると確信するようになりますが、StoneBlock は構築時にブロックが存在する必要があります。残念ながら、要求に応じて値を返すゲッターに定数をやり直す必要があるようです。

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 に答える