Suggerimento rapido come eseguire il debug di un errore AS3 n. 1203

In questo suggerimento, discuteremo l'errore confuso AS3 1203, "nessun costruttore trovato", che emerge senza provocazione ed è piuttosto sfortunatamente formulato. Esamineremo lo scenario in cui verrà visualizzato e come risolverlo.


Passaggio 1: una descrizione obbligatoria ma un po 'inutile dell'errore 1203

Innanzitutto, ecco la lingua dell'errore:

 1203: Nessun costruttore predefinito trovato nella classe base flash.display: BitmapData.

È difficile suddividere questo in un inglese semplice. Quindi passiamo a uno scenario che produce questo errore.


Passaggio 2: un progetto Busted

Puoi trovare questo progetto nel pacchetto di download, nella cartella "arrestato". Consiste di quanto segue (che è possibile utilizzare per ricreare questo progetto se si preferisce un approccio pratico):

  1. Un nome FLA Busted.fla. È vuoto, ma è collegato alla classe del documento descritta di seguito.
  2. Una classe di documenti chiamata Busted.as. Questo si estende folletto e semplicemente crea un'istanza della classe descritta successivamente, e la aggiunge allo stage.
    I contenuti della classe sono i seguenti:

     pacchetto import flash.display. *; public class Busted estende Sprite public function Busted () var bmp: Bitmap = new Bitmap (new BustedBitmap ()); addChild (BMP); 

    Il BustedBitmap la classe si estende BitmapData, e così lo usiamo per nutrire a Bitmap oggetto, che viene quindi aggiunto allo stage.

  3. Un altro file di classe chiamato BustedBitmap.as. Come accennato in precedenza, questo si estende BitmapData, e il suo scopo è quello di essere un BitmapData che si autoalimenta automaticamente con qualche rumore Perlin. I suoi contenuti sono:

     pacchetto import flash.display. *; public class BustedBitmap estende BitmapData public function BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

    Quindi, nel BustedBitmap costruttore, noi chiamiamo perlinNoise () e quindi abbiamo automaticamente qualcosa di interessante nei dati dei pixel, in modo che possiamo vedere subito qualcosa durante la visualizzazione sul palco.

Ora, vai avanti e prova il film. Otterrai l'errore 1203, puntato alla riga 4 di BustedBitmap.as. E la linea 4 è ...

 funzione pubblica BustedBitmap () 

Passo 3: Cos'è tutto questo, allora?

Allora, cos'è successo? La cosa importante da tenere a mente è che stiamo scrivendo una classe che è una sottoclasse di un'altra classe (BitmapData in questo caso). Inoltre, tieni presente che quando una classe viene istanziata, il costruttore viene chiamato come parte del "nuovo" processi.

Se in realtà non si scrive un costruttore, ActionScript implicherà uno per te. Sembrerà così:

 funzione pubblica [NameOfClass] () 

Dove "[NameOfClass]"corrisponderà al nome della tua classe.

Allo stesso modo, se scrivi una sottoclasse e non chiami super() al suo interno, quindi ActionScript implicherà anche quella chiamata per te. Sembrerà così:

 funzione pubblica [NameOfSubclass] () super (); // Altro codice esplicito nel costruttore della sottoclasse

Si noti che succede sulla prima riga, ed è semplicemente una chiamata a super senza argomenti.

Alla fine, arriviamo alla radice del problema. Se la sottoclasse omette una chiamata esplicita a super, e il costruttore della tua superclasse ha richiesto parametri, quindi la tua chiamata implicita a super non fornisce i parametri richiesti. Si potrebbe pensare che un errore di disallineamento di argomento potrebbe catturare questo, ma si consideri che poiché non c'è alcun codice effettivamente scritto per rendere la mancata corrispondenza, ActionScript può solo lamentarsi della mancanza di un costruttore predefinito.

Nel nostro esempio, BustedBitmap estendere BitmapData, che ha un costruttore definito nella documentazione in questo modo:

 BitmapData (larghezza: int, altezza: int, trasparente: Boolean = true, fillColor: uint = 0xFFFFFFFF)

Sono richiesti i primi due parametri e non li stiamo fornendo.


Passaggio 4: è semplice come ...

La soluzione è, una volta compreso il problema, estremamente semplice. Devi chiamare esplicitamente il super costruttore, almeno se ci sono parametri richiesti. In altre parole, nel nostro BustedBitmap classe, questa seguente linea evidenziata risolverà il problema:

 pacchetto import flash.display. *; public class BustedBitmap estende BitmapData public function BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

E questo lo farà.

Come momento insegnabile, vorrei aggiungere che, quando estendi un altro corso, è generalmente una buona idea includere la chiamata esplicita a super. Anche se non ci sono parametri, richiesti o meno (come in folletto o Un filmato), una chiamata esplicita può dichiarare l'intenzione e la consapevolezza della natura della sottoclasse. Più praticamente, le chiamate esplicite ti danno l'opportunità di eseguire del codice prima della chiamata a super, che può essere utile in determinate situazioni.


Step 5: ... E questo è tutto

Ancora un altro errore demistificato; la sfida per questo è che la vera causa dell'errore è completamente sepolta. Una volta diventato pratico con una pala, tuttavia, la correzione è abbastanza semplice.

Grazie per la lettura ed essere pronti per ulteriori suggerimenti per il debug.