¿Cómo puedes usar clases internas en contexto estático?

Quiero usar clases internas para crear una jerarquía de objetos para evitar saturar la API de mi proyecto actual. La idea básica es usar algo como esto:

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

para que pueda usarlo como someFunction(Bar.BLUBB.GNARF.GNARF_BLAH);

Sin embargo, al parecer, a Actionscript no le gusta esta construcción (aunque FDT5 la compila sin preocuparse por nada) y me da el siguiente error de tiempo de ejecución:

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

con el resto del seguimiento de la pila que conduce al punto en el que intenté acceder por primera vez a cualquiera de las constantes estáticas de Bar.

¿Realmente no es posible usar clases internas de esa manera o simplemente me estoy perdiendo algún vudú secreto?

preguntado el 03 de mayo de 12 a las 19:05

Mi suposición es que el vudú secreto involucrado es un inicializador estático, pero aún no lo he hecho funcionar. -

1 Respuestas

No pude hacer que esto funcionara como querías, pero encontré algunas cosas potencialmente útiles:

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

Tuve que eliminar los modificadores estáticos para las variables de Bar, pero descubrí que podía agregar "estático" a Blubb.GNARF siempre que Gnarf se definió por encima de Blubb. En base a esto, intenté mover las tres clases internas por encima de la definición del paquete, pero resulta que eso no está permitido. (Además, no puede acceder directamente a las clases internas desde otro archivo, por lo que tener una variable estática en uno de ellos no es útil).

También intenté hacer de Bar.BLUBB una variable estática e inicializarla en el bloque de inicialización estática en lugar de en línea, pero eso no supuso ninguna diferencia. Creo que si desea usar un determinado tipo de clase para una variable estática, debe definir ese tipo de clase en un archivo separado.

contestado el 03 de mayo de 12 a las 20:05

Estuve jugando un poco más con el problema, siguiendo sus sugerencias y aciertos, y llegué al resultado de que no puedo hacer lo que quiero de la manera que quiero. Entonces, en aras de una API limpia, tomé todas las clases internas de sus archivos originales, las puse en archivos de clase separados y las metí en un paquete que espero nunca volver a mirar. ^^ - usuario1346245

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.