Sfat rapid Cum se depanează o eroare AS3 # 1203

În acest sfat rapid, vom discuta eroarea confuză AS3 1203, "nici un constructor găsit", care provine fără provocări și este, din păcate, formulat, din păcate. Vom examina scenariul în care va apărea și cum se va rezolva.


Pasul 1: O descriere obligatorie dar deloc inutilă a erorii 1203

Mai întâi, aici este limba erorii:

 1203: Nu există constructor implicit găsit în clasa de bază flash.display: BitmapData.

Este greu să spargi acest lucru în engleză. Deci, haideți să trecem la un scenariu care produce această eroare.


Pasul 2: Un proiect blocat

Puteți găsi acest proiect în pachetul de descărcare, în dosarul "prins"Constă din următoarele (pe care le puteți utiliza pentru a re-crea acest proiect dacă preferați o abordare hands-on):

  1. Un nume FLA Busted.fla. Este gol, dar este legat de clasa de documente descrisă în continuare.
  2. O clasă de documente numită Busted.as. Acest lucru se extinde spiriduș și creează pur și simplu o instanță a clasei descrisă în continuare și o adaugă la scenă.
    Conținutul clasei este după cum urmează:

     pachet import flash.display. *; clasa publică Busted extinde Sprite funcția publică Busted () var bmp: Bitmap = Bitmap nou (noul BustedBitmap ()); addChild (bmp); 

    BustedBitmap clasa se extinde BitmapData, și astfel îl folosim pentru a alimenta o Bitmap obiect, care este apoi adăugat la etapă.

  3. Un alt fișier de clasă numit BustedBitmap.as. După cum sa menționat anterior, acest lucru se extinde BitmapData, iar scopul său este să fie a BitmapData care se alimentează automat cu un zgomot Perlin. Conținutul său este:

     pachet import flash.display. *; clasa publică BustedBitmap extinde BitmapData funcția publică BustedBitmap () perlinNoise (100, 100, 2, 1024, falsă, falsă, 7, adevărată); 

    Deci, în BustedBitmap constructor, suntem perlinNoise () și, prin urmare, avem în mod automat ceva interesant în datele pixelilor, astfel încât să vedem ceva imediat când se afișează pe scenă.

Acum, continuați și testați filmul. Veți primi Eroarea 1203, indicată la linia 4 din BustedBitmap.as. Și linia 4 este ...

 funcția publică BustedBitmap () 

Pasul 3: Ce e tot, atunci?

Deci ce s-a întâmplat? Lucrul important de reținut este că scriem o clasă care este o subclasă a unei alte clase (BitmapData în acest caz). De asemenea, rețineți că atunci când o clasă este instanțiată, constructorul este chemat ca parte a "nou"proces.

Dacă nu scrieți un constructor, ActionScript va implica unul pentru dvs. Acesta va arata astfel:

 funcția publică [NameOfClass] () 

Unde "[NameOfClass]"se va potrivi cu numele clasei tale.

În mod similar, dacă scrieți o subclasă și nu sunați super() în ea, atunci ActionScript va implica și apelul pentru tine. Acesta va arata astfel:

 funcția publică [NameOfSubclass] () super (); // Alt cod explicit în constructor subclasă

Rețineți că se întâmplă pe prima linie și este pur și simplu un apel către super fără argumente.

În cele din urmă, ajungem la rădăcina problemei. Dacă subclasa dvs. omite un apel explicit către super, iar constructorul superclass a cerut parametrii, apoi apelul dvs. implicit super nu furnizează parametrii necesari. S-ar gândi că o eroare de nepotrivire a argumentului ar putea prinde acest lucru, dar considerăm că, deoarece nu există niciun cod scris pentru a face această nepotrivire, ActionScript se poate plânge numai că lipsa unui constructor implicit.

În exemplul nostru, BustedBitmap extinde BitmapData, care are un constructor definit în documentație astfel:

 BitmapData (lățime: int, înălțime: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)

Primii doi parametri sunt necesari și nu le furnizăm.


Pasul 4: Este la fel de simplu ca ...

Soluția este, odată ce înțelegeți problema, extrem de simplă. Trebuie să sunați în mod explicit constructorul super, cel puțin dacă există parametri necesari. Cu alte cuvinte, în BustedBitmap clasa, această linie urmată va rezolva problema:

 pachet import flash.display. *; clasa publică BustedBitmap extinde BitmapData funcția publică BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, fals, fals, 7, adevărat); 

Și asta o va face.

Ca un moment de învățat, aș dori să adaug că atunci când se prelungește o altă clasă, este în general o idee bună să includeți apelul explicit către super. Chiar dacă nu există niciun parametru, necesar sau altfel (ca în spiriduș sau MovieClip), un apel explicit poate declara intenția și conștientizarea naturii subclasei. Practic, apelurile explicite vă oferă posibilitatea de a rula un anumit cod înainte de apelul către super, care poate fi utilă în anumite situații.


Pasul 5: ... Și asta este tot

O altă eroare a fost demisificată; provocarea pentru aceasta este că adevărata cauză a erorii este destul de îngropată. Odată ce ați devenit la îndemână cu o lopată, totuși, reparația este suficient de ușoară.

Vă mulțumim pentru citire și fiți pregătiți pentru mai multe sfaturi de depanare.

Cod