I den här snabba tipset diskuterar vi det förvirrande AS3-felet 1203, "ingen konstruktör hittad", som väcker upp sig utan provokation och är ganska tyvärr formulerad. Vi undersöker scenariot där det kommer att visas och hur du fixar det.
Först här är felets språk:
1203: Ingen standardkonstruktor hittades i basklassflash.display: BitmapData.
Det är svårt att bryta ner det här i vanlig engelska. Så låt oss gå vidare till ett scenario som producerar detta fel.
Du kan hitta projektet i nedladdningspaketet, i mappen "busted". Det består av följande (som du kan använda för att skapa om detta projekt om du föredrar en praktisk metod):
En dokument klass som heter Busted.as. Detta sträcker sig Sprite
och skapar helt enkelt en förekomst av klassen som beskrivs nedan, och lägger den till scenen.
Innehållet i klassen är som följer:
paket import flash.display. *; offentlig klass Busted sträcker Sprite public function Busted () var bmp: Bitmap = ny Bitmap (new BustedBitmap ()); addChild (BMP);
De BustedBitmap
klassen sträcker sig BitmapData
, och så använder vi den för att mata en Bitmap
objekt, som sedan läggs till scenen.
En annan klassfil som heter BustedBitmap.as. Som tidigare nämnts sträcker detta sig BitmapData
, och dess syfte är att vara en BitmapData
som automatiskt levererar sig med lite Perlin-brus. Dess innehåll är:
paket import flash.display. *; public class BustedBitmap utökar BitmapData public function BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true);
Så, i BustedBitmap
konstruktör, vi kallar perlinNoise ()
och så har vi automatiskt något intressant i pixeldata, så vi kan se någonting direkt när vi visar på scenen.
Nu, fortsätt och testa filmen. Du kommer att få Error 1203, pekad på rad 4 av BustedBitmap.as. Och rad 4 är ...
allmän funktion BustedBitmap ()
Så vad hände? Den stora sak att tänka på är att vi skriver en klass som är en underklass i en annan klass (BitmapData
I detta fall). Tänk också på att när en klass är instanserad kallas konstruktören som en del av "ny
" bearbeta.
Om du inte faktiskt skriver en konstruktör, betyder ActionScript en för dig. Det kommer att se ut så här:
allmän funktion [NameOfClass] ()
Var "[NameOfClass]
"matchar namnet på din klass.
På samma sätt, om du skriver en underklass och inte ringer super()
i det, så innebär ActionScript det samtalet för dig också. Det kommer att se ut så här:
offentlig funktion [NameOfSubclass] () super (); // Annan exakt kod i underklassen konstruktör
Observera att det händer på första raden och är helt enkelt ett samtal till super
utan argument.
Slutligen kommer vi till roten till problemet. Om din underklass utesluter ett uttryckligt samtal till super
, och din superklass konstruktör har krävt parametrar, sedan ditt implicita samtal till super
levererar inte nödvändiga parametrar. Du skulle tro att ett felmatchningsfel för argument kunde fånga det här, men anser att eftersom det inte finns någon kod som faktiskt skrivits för att göra felmatchningen, kan ActionScript bara klaga på att bristen på en standardkonstruktor.
I vårt exempel, BustedBitmap
förlänga BitmapData
, som har en konstruktor definierad i dokumentationen som sådan:
BitmapData (bredd: int, höjd: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)
De två första parametrarna krävs, och vi levererar inte dem.
Lösningen är, när du förstår problemet, extremt enkelt. Du måste uttryckligen ringa superkonstruktören, åtminstone om det finns parametrar som krävs. Med andra ord, i vår BustedBitmap
klassen kommer följande följande markerade rad att lösa problemet:
paket import flash.display. *; public class BustedBitmap utökar BitmapData public function BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, false, false, 7, true);
Och det kommer att göra det.
Som ett lärbart ögonblick skulle jag vilja tillägga att när det gäller att utöka en annan klass är det generellt en bra idé att inkludera det uttryckliga samtalet till super
. Även om det inte finns några parametrar alls, krävs eller på annat sätt (som i Sprite
eller Filmklipp
) kan ett uttryckligt samtal förklara avsikten och medvetenheten om underklassens natur. Mer praktiskt taget ger uttryckliga samtal en möjlighet att köra en kod före samtalet till super
, vilket kan vara till hjälp i vissa situationer.
Ett annat fel demystifieras; Utmaningen för den här är att den verkliga orsaken till felet är ganska begravd. När du väl har blivit praktisk med en spade, är fixningen lätt nog.
Tack för att du läste och var redo för fler felsökningstips.