4

現在のプロジェクトのAPIが乱雑にならないように、内部クラスを使用してオブジェクトの階層を作成したいと思います。基本的な考え方は、次のようなものを使用することです。

package foo {
    public class Bar {
        public static const BLUBB:Blubb = new Blubb();
        public static const ZONK:Zonk = new Zonk();
    }
}
class Blubb {
    public const GNARF:Gnarf = new Gnarf();
    public const BLUBB_BLAH:String = "blubb-blah";
}
class Gnarf {
    public const GNARF_BLAH:String = "gnarf-blah";
}
class Zonk {
    public const ZONK_BLAH:String = "zonk-blah";
}

私はそれを次のように使用できるようにsomeFunction(Bar.BLUBB.GNARF.GNARF_BLAH);

ただし、どうやらActionscriptはこの構成をまったく気に入っていないようで(FDT5はそれについての騒ぎを与えずにコンパイルしますが)、次のランタイムエラーが発生します。

Exception fault: TypeError: Error #1007: Instantiation attempted on a non-constructor.
    at foo::Bar$cinit()
    at global$init()
    at ...

スタックトレースの残りの部分は、の静的定数のいずれかに最初にアクセスしようとしたポイントにつながりますBar

そのような方法で内部クラスを使用することは本当に不可能ですか、それとも私はいくつかの秘密のブードゥーを見逃しているだけですか?

4

1 に答える 1

2

私はこれをあなたが望むように機能させることができませんでした、しかし私はいくつかの潜在的に有用なものを見つけました:

package foo {
    public class Bar {
        public const BLUBB:Blubb = new Blubb();
        public const ZONK:Zonk = new Zonk();
    }
}
class Gnarf {
    public const GNARF_BLAH:String = "gnarf-blah";
}
class Blubb {
    public static const GNARF:Gnarf = new Gnarf();
    public const BLUBB_BLAH:String = "blubb-blah";
}
class Zonk {
    public const ZONK_BLAH:String = "zonk-blah";
}

Barの変数の静的修飾子を削除する必要がありましたが、 GnarfがBlubbの上で定義されている限り、 Blubb.GNARFに「静的」を追加できることがわかりました。これに基づいて、3つの内部クラスすべてをパッケージ定義の上に移動しようとしましたが、許可されていないことがわかりました。(また、別のファイルから内部クラスに直接アクセスすることはできないため、それらの1つに静的変数を含めること自体は役に立ちません。)

また、Bar.BLUBBを静的変数にして、インラインではなく静的初期化ブロックで初期化しようとしましたが、違いはありませんでした。静的変数に特定のクラスタイプを使用する場合は、そのクラスタイプを別のファイルで定義する必要があると思います。

于 2012-05-03T19:19:57.893 に答える