2012-05-03 2 views
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 компилирует его, не давая Frell о она) и дает мне следующую ошибку во время выполнения:

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

с остальной частью StackTrace, ведущей к точке, где я первый попытался получить доступ к любому из статических констант Bar.

Действительно ли невозможно использовать внутренние классы таким образом, или я просто не хватает какого-то тайного вуду?

+0

Моя догадка заключается в том, что секретный вуду - это [статический инициализатор] (http://manishjethani.com/archives/2008/03/31/static-initializers-in-as3), но я не сделал его работу все же. –

ответ

3

я не смог получить эту работу, как вы хотели, но я нашел некоторые потенциально полезные вещи:

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

я должен был вывезти статические модификаторы для переменной Коллегии адвокатов, но я обнаружил, что я мог бы добавить «статический» для Blubb.GNARF до тех пор, пока Gnarf был определен выше Blubb. Исходя из этого, я попытался переместить все три внутренних класса выше определения пакета, но оказывается, что это запрещено. (Кроме того, вы не можете напрямую обращаться к внутренним классам из другого файла, поэтому статическая переменная в одном из них сама по себе не является полезной.)

Я также попытался сделать Bar.BLUBB статическим var и инициализировать его в статический блок инициализации, а не встроенный, но это не имело никакого значения. Я думаю, что если вы хотите использовать определенный тип класса для статической переменной, вы должны определить этот тип класса в отдельном файле.

+0

Я уже несколько раз сталкивался с проблемой, следуя вашим предложениям и хитам, и пришел к тому, что я не могу делать то, что хочу, как хочу. Итак, ради чистого API я взял все внутренние классы из своих исходных файлов, поместил их каждый в отдельные файлы классов и набил их в пакет, на который я надеюсь больше не смотреть. ^^ – arotter

Смежные вопросы