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.
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.
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):
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.
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 ()
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.
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.
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.