In deze Quick Tip bespreken we de verwarrende AS3-fout 1203, "geen constructor gevonden", die opduikt zonder provocatie en nogal spijtig genoeg is geformuleerd. We zullen het scenario bekijken waarin het zal verschijnen en hoe het te repareren.
Ten eerste, hier is de taal van de fout:
1203: Geen standaardconstructor gevonden in basisklasse flash.display: BitmapData.
Het is moeilijk om dit op te splitsen in gewoon Engels. Dus laten we vervolgens overgaan tot een scenario dat deze fout veroorzaakt.
Je vindt dit project in het downloadpakket, in de map "opgepakt"Het bestaat uit het volgende (dat je kunt gebruiken om dit project opnieuw te maken als je een praktische benadering prefereert):
Een documentklasse met de naam Busted.as. Dit breidt zich uit sprite
en maakt eenvoudig een exemplaar van de klasse die hierna wordt beschreven en voegt deze toe aan het werkgebied.
De inhoud van de klasse is als volgt:
pakket import flash.display. *; public class Busted breidt Sprite uit openbare functie Busted () var bmp: Bitmap = nieuwe Bitmap (nieuwe BustedBitmap ()); addChild (BMP);
De BustedBitmap
klasse breidt zich uit BitmapData
, en dus gebruiken we het om een te voeden Bitmap
object, dat vervolgens aan het werkgebied wordt toegevoegd.
Een ander klassenbestand met de naam BustedBitmap.as. Zoals eerder vermeld, breidt dit zich uit BitmapData
, en het doel is om een te zijn BitmapData
die zichzelf automatisch voorziet van wat Perlin-ruis. De inhoud ervan is:
pakket import flash.display. *; public class BustedBitmap breidt BitmapData uit public function BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true);
Dus in de BustedBitmap
constructor, we bellen perlinNoise ()
en dus hebben we automatisch iets interessants in de pixeldata, zodat we meteen iets kunnen zien wanneer we het op het podium vertonen.
Nu, ga je gang en test de film. U krijgt Error 1203, gericht op regel 4 van BustedBitmap.as. En regel 4 is ...
public function BustedBitmap ()
Dus wat gebeurde er? Het grote ding om in gedachten te houden is dat we een klasse schrijven die een subklasse van een andere klasse is (BitmapData
in dit geval). Houd er ook rekening mee dat wanneer een klasse wordt geïnstantieerd, de constructor wordt opgeroepen als onderdeel van de "nieuwe
" werkwijze.
Als u geen constructor schrijft, impliceert ActionScript er een voor u. Het ziet er als volgt uit:
openbare functie [NameOfClass] ()
Waar "[NameOfClass]
"komt overeen met de naam van uw klas.
Evenzo, als u een subklasse schrijft en niet belt super()
erin, dan zal ActionScript ook die oproep voor u impliceren. Het ziet er als volgt uit:
openbare functie [NameOfSubclass] () super (); // Andere expliciete code in constructor van subklasse
Merk op dat het gebeurt op de eerste regel en dat het gewoon een oproep is naar super
zonder argumenten.
Ten slotte komen we bij de wortel van het probleem. Als uw subklasse een expliciete aanroep weglaat naar super
, en de constructor van je superklasse heeft parameters nodig, daarna je impliciete oproep super
levert niet de vereiste parameters. Je zou denken dat een fout in een foutmelding over een fout dit zou kunnen opvangen, maar bedenk dat ActionScript alleen kan klagen over het ontbreken van een standaardconstructor, omdat er geen code is die daadwerkelijk is geschreven om de mismatch te maken.
In ons voorbeeld, BustedBitmap
uitbreiden BitmapData
, waarbij een constructor is gedefinieerd in de documentatie als volgt:
BitmapData (width: int, height: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)
De eerste twee parameters zijn vereist en we leveren ze niet.
De oplossing is, als u eenmaal het probleem begrijpt, uiterst eenvoudig. U moet de superconstructor expliciet bellen, tenminste als er vereiste parameters zijn. Met andere woorden, in onze BustedBitmap
klasse, deze volgende gemarkeerde regel lost het probleem op:
pakket import flash.display. *; public class BustedBitmap breidt BitmapData uit public function BustedBitmap () super (600, 400); perlinNoise (100, 100, 2, 1024, false, false, 7, true);
En dat zal het doen.
Als een leermoment, zou ik willen toevoegen dat het bij het uitbreiden van een andere klas over het algemeen een goed idee is om de expliciete aanroep naar super
. Zelfs als er helemaal geen parameters zijn, vereist of anderszins (zoals in sprite
of Filmclip
), kan een expliciete oproep de intentie en het bewustzijn van de aard van de subklasse verklaren. Praktischer gezegd, geven expliciete oproepen u de mogelijkheid om wat code uit te voeren voorafgaand aan de oproep naar super
, wat in bepaalde situaties nuttig kan zijn.
Nog een andere fout ontraadseld; de uitdaging voor deze is dat de echte oorzaak van de fout behoorlijk begraven is. Zodra je echter handig wordt met een schop, is de oplossing eenvoudig genoeg.
Bedankt voor het lezen en wees voorbereid op meer tips voor foutopsporing.