Consejo rápido Cómo depurar un error AS3 # 1203

En esta Sugerencia rápida, analizaremos el confuso error AS3 1203, "no se encontró un constructor", que surge sin provocación y, lamentablemente, está redactado. Examinaremos el escenario en el que aparecerá y cómo solucionarlo..


Paso 1: Una descripción obligatoria del error 1203 pero algo inútil.

Primero, aquí está el lenguaje del error:

 1203: No se ha encontrado ningún constructor predeterminado en la clase base flash.display: BitmapData.

Es difícil dividir esto en un lenguaje sencillo. Entonces pasemos al siguiente escenario que produce este error..


Paso 2: Un Proyecto Busted

Puedes encontrar este proyecto en el paquete de descarga, en la carpeta "reventado". Consiste en lo siguiente (que puede utilizar para volver a crear este proyecto si prefiere un enfoque práctico):

  1. Una FLA llamada Busted.fla. Está vacío, pero está vinculado a la clase de documento que se describe a continuación.
  2. Una clase de documento llamada Busted.as. Esto se extiende Duende y simplemente crea una instancia de la clase que se describe a continuación, y la agrega al escenario.
    Los contenidos de la clase son los siguientes:

     paquete import flash.display. *; clase pública Busted extiende Sprite función pública Busted () var bmp: Bitmap = nuevo Bitmap (nuevo BustedBitmap ()); addChild (bmp); 

    los BustedBitmap clase se extiende BitmapData, Y así lo usamos para alimentar a un Mapa de bits objeto, que luego se agrega a la etapa.

  3. Otro archivo de clase llamado BustedBitmap.as. Como se mencionó anteriormente, esto se extiende BitmapData, y su finalidad es ser un BitmapData que automáticamente se suministra con un poco de ruido Perlin. Sus contenidos son:

     paquete import flash.display. *; la clase pública BustedBitmap amplía BitmapData función pública BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

    Así, en el BustedBitmap constructor, llamamos perlinNoise () y así tenemos automáticamente algo interesante en los datos de píxeles, por lo que podemos ver algo de inmediato cuando se muestra en el escenario.

Ahora, adelante y prueba la película. Obtendrá el error 1203, señalado en la línea 4 de BustedBitmap.as. Y la línea 4 es ...

 función pública BustedBitmap () 

Paso 3: ¿Qué es todo esto, entonces??

¿Entonces qué pasó? Lo importante a tener en cuenta es que estamos escribiendo una clase que es una subclase de otra clase (BitmapData en este caso). También tenga en cuenta que cuando se crea una instancia de una clase, se llama al constructor como parte de "nuevo"proceso.

Si en realidad no escribe un constructor, ActionScript implicará uno para usted. Se verá así:

 función pública [NameOfClass] () 

Dónde "[NameOfClass]"coincidirá con el nombre de tu clase.

Del mismo modo, si escribe una subclase, y no llama súper() en él, entonces ActionScript implicará que la llamada para ti, también. Se verá así:

 función pública [NameOfSubclass] () super (); // Otro código explícito en subclase constructor

Tenga en cuenta que sucede en la primera línea, y es simplemente una llamada a súper sin argumentos.

Finalmente, llegamos a la raíz del problema. Si su subclase omite una llamada explícita a súper, y el constructor de su superclase ha requerido parámetros, entonces su llamada implícita a súper No suministra los parámetros requeridos. Usted pensaría que un error de falta de coincidencia de argumento podría detectar esto, pero tenga en cuenta que dado que no hay ningún código escrito realmente para hacer que no coincida, ActionScript solo puede quejarse de que la falta de un constructor predeterminado.

En nuestro ejemplo, BustedBitmap ampliar BitmapData, que tiene un constructor definido en la documentación como tal:

 BitmapData (width: int, height: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)

Los primeros dos parámetros son necesarios y no los estamos suministrando..


Paso 4: Es tan simple como ...

La solución es, una vez que entiendes el problema, extremadamente simple. Debe llamar explícitamente al súper constructor, al menos si hay parámetros necesarios. En otras palabras, en nuestro BustedBitmap clase, esta siguiente línea resaltada solucionará el problema:

 paquete import flash.display. *; La clase pública BustedBitmap extiende BitmapData función pública BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, falso, falso, 7, verdadero); 

Y eso lo hare.

Como un momento de aprendizaje, me gustaría agregar que, al extender otra clase, generalmente es una buena idea incluir el llamado explícito a súper. Incluso si no hay ningún parámetro, requerido o no (como en Duende o Clip de película), una llamada explícita puede declarar intención y conocimiento de la naturaleza de la subclase. Más prácticamente, las llamadas explícitas le dan la oportunidad de ejecutar un código antes de la llamada a súper, lo cual puede ser útil en ciertas situaciones.


Paso 5:… y eso es todo

Otro error más desmitificado; El desafío para este es que la causa real del error está bastante oculta. Sin embargo, una vez que te conviertes en una pala, la solución es bastante fácil.

Gracias por leer y prepárate para más sugerencias de depuración..