Hurtig Tips Slik feilsøker du en AS3-feil # 1203

I denne Quick Tip diskuterer vi den forvirrende AS3-feilen 1203, "ingen konstruktør funnet", som kaster opp uten provokasjon og er ganske desverre formulert. Vi undersøker scenariet der det skal vises, og hvordan du løser det.


Trinn 1: En obligatorisk men noe ubrukelig beskrivelse av feil 1203

Først, her er feilens språk:

 1203: Ingen standardkonstruktor funnet i grunnklassen flash.display: BitmapData.

Det er vanskelig å bryte dette ned i ren engelsk. Så la oss gå videre til et scenario som produserer denne feilen.


Trinn 2: Et busted prosjekt

Du finner dette prosjektet i nedlastingspakken, i mappen "tatt på fersken". Det består av følgende (som du kan bruke til å gjenopprette dette prosjektet hvis du foretrekker en praktisk tilnærming):

  1. En FLA navngitt Busted.fla. Det er tomt, men er knyttet til dokumentklassen som er beskrevet nedenfor.
  2. En dokumentklasse som heter Busted.as. Dette strekker seg Sprite og skaper bare en forekomst av klassen som er beskrevet neste, og legger den til scenen.
    Innholdet i klassen er som følger:

     pakke import flash.display. *; offentlig klasse Busted strekker Sprite public function Busted () var bmp: Bitmap = ny Bitmap (new BustedBitmap ()); addChild (BMP); 

    De BustedBitmap klassen strekker seg BitmapData, og så bruker vi den til å mate en bitmap objekt, som deretter legges til scenen.

  3. En annen klassefil som heter BustedBitmap.as. Som nevnt tidligere strekker dette seg ut BitmapData, og hensikten er å være en BitmapData som automatisk forsyner seg med litt Perlin-støy. Innholdet er:

     pakke import flash.display. *; offentlig klasse BustedBitmap utvider BitmapData offentlig funksjon BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

    Så, i BustedBitmap konstruktør, vi kaller perlinNoise () og dermed har vi automatisk noe interessant i pikseldataene, slik at vi kan se noe med en gang når vi viser på scenen.

Nå, fortsett og test filmen. Du får Error 1203, spiss på linje 4 av BustedBitmap.as. Og linje 4 er ...

 offentlig funksjon BustedBitmap () 

Trinn 3: Hva er alt dette, da?

Så hva skjedde? Den store tingen å huske på er at vi skriver en klasse som er en underklasse av en annen klasse (BitmapData i dette tilfellet). Vær også oppmerksom på at når en klasse er instantiated, kalles konstruktøren som en del av "ny" prosess.

Hvis du ikke faktisk skriver en konstruktør, vil ActionScript innebære en for deg. Det vil se slik ut:

 offentlig funksjon [NameOfClass] () 

Hvor "[NameOfClass]"vil matche navnet på klassen din.

Tilsvarende, hvis du skriver en underklasse, og ikke ring super() i det, så vil ActionScript innebære at samtalen for deg også. Det vil se slik ut:

 offentlig funksjon [NameOfSubclass] () super (); // Andre eksplisitte kode i underklassekonstruktør

Legg merke til at det skjer på første linje, og er bare et anrop til super uten argumenter.

Til slutt kommer vi til roten til problemet. Hvis din underklasse overlater et uttrykkelig kall til super, og superklassens konstruktør har krevd parametere, og deretter din implisitte samtale til super leverer ikke de nødvendige parametrene. Du vil tro at en feilfeil for mislighold kan mislykkes, men vurder at siden ActionScript ikke har noen kode som faktisk er skrevet for å gjøre feil, kan ActionScript bare klage på at mangelen på en standardkonstruktør.

I vårt eksempel, BustedBitmap forlenge BitmapData, som har en konstruktør definert i dokumentasjonen som sådan:

 BitmapData (bredde: int, høyde: int, gjennomsiktig: Boolean = true, fillColor: uint = 0xFFFFFFFF)

De to første parametrene kreves, og vi leverer ikke dem.


Trinn 4: Det er så enkelt som ...

Løsningen er, når du forstår problemet, ekstremt enkelt. Du må eksplisitt ringe superkonstruktøren, i det minste hvis det er nødvendige parametere. Med andre ord, i vår BustedBitmap klassen, vil denne følgende uthevede linjen løse problemet:

 pakke import flash.display. *; offentlig klasse BustedBitmap utvider BitmapData offentlig funksjon BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, false, false, 7, true); 

Og det vil gjøre det.

Som et lærbart øyeblikk vil jeg gjerne legge til at når det utvides en annen klasse, er det generelt en god ide å inkludere det eksplisitte anropet til super. Selv om det ikke er noen parametere i det hele tatt, kreves eller på annen måte (som i Sprite eller Filmklipp), kan et eksplisitt anrop deklarere intensjon og bevissthet om underklasseets art. Mer praktisk, gir eksplisitte samtaler deg muligheten til å kjøre en kode før samtalen til super, som kan være nyttig i visse situasjoner.


Trinn 5: ... Og det er alt

Enda en annen feil demystified; Utfordringen for dette er at den virkelige årsaken til feilen er ganske begravet. Når du blir praktisk med en spade, er det imidlertid lett nok.

Takk for at du leser, og vær klar for flere feilsøkingstips.