In diesem Schnelltipp werden wir den verwirrenden AS3-Fehler 1203 "Kein Konstruktor gefunden" besprechen, der ohne Provokation auftaucht und leider eher formuliert ist. Wir untersuchen das Szenario, in dem es erscheinen wird und wie es behoben werden kann.
Zuerst ist hier die Sprache des Fehlers:
1203: In der Basisklasse flash.display wurde kein Standardkonstruktor gefunden: BitmapData.
Es ist schwierig, dies in einfaches Englisch zu unterteilen. Gehen wir als nächstes zu einem Szenario über, das diesen Fehler erzeugt.
Sie finden dieses Projekt im Download-Paket im Ordner "Gehackt". Es besteht aus den folgenden Elementen (die Sie verwenden können, um dieses Projekt neu zu erstellen, wenn Sie einen praktischen Ansatz bevorzugen):
Eine Dokumentklasse mit dem Namen Busted.as. Das reicht aus Sprite
und erstellt einfach eine Instanz der als nächstes beschriebenen Klasse und fügt sie der Bühne hinzu.
Die Inhalte der Klasse lauten wie folgt:
Paket import flash.display. *; public class Busted erweitert Sprite öffentliche Funktion Busted () var bmp: Bitmap = new Bitmap (new BustedBitmap ()); addChild (bmp);
Das BustedBitmap
Klasse erweitert BitmapData
, und so benutzen wir es, um Bitmap
Objekt, das dann der Bühne hinzugefügt wird.
Eine andere Klassendatei mit dem Namen BustedBitmap.as. Wie bereits erwähnt, erstreckt sich dies BitmapData
, und sein Zweck ist es, a zu sein BitmapData
das versorgt sich automatisch mit etwas Perlin-Rauschen. Sein Inhalt ist:
Paket import flash.display. *; public class BustedBitmap erweitert BitmapData public function BustedBitmap () perlinNoise (100, 100, 2, 1024, false, false, 7, true);
Also in der BustedBitmap
Konstruktor nennen wir perlinNoise ()
und so haben wir automatisch etwas Interessantes in den Pixeldaten, so dass wir sofort etwas auf der Bühne sehen können.
Testen Sie jetzt den Film. Sie erhalten den Fehler 1203 in Zeile 4 von BustedBitmap.as. Und Linie 4 ist…
öffentliche Funktion BustedBitmap ()
Also was ist passiert? Das Wichtigste, das wir im Hinterkopf behalten sollten, ist, dass wir eine Klasse schreiben, die eine Unterklasse einer anderen Klasse ist (BitmapData
in diesem Fall). Denken Sie auch daran, dass der Konstruktor beim Instanziieren einer Klasse als Teil von "Neu
"Prozess.
Wenn Sie eigentlich keinen Konstruktor schreiben, wird in ActionScript für Sie ein Konstruktor verwendet. Es wird so aussehen:
öffentliche Funktion [NameOfClass] ()
Woher "[NameOfClass]
"stimmt mit dem Namen Ihrer Klasse überein.
Ähnlich, wenn Sie eine Unterklasse schreiben und nicht anrufen Super()
Darin impliziert ActionScript diesen Aufruf auch für Sie. Es wird so aussehen:
public function [NameOfSubclass] () super (); // Anderer expliziter Code im Unterklassenkonstruktor
Beachten Sie, dass dies in der ersten Zeile geschieht und es sich lediglich um einen Anruf handelt Super
ohne Argumente.
Schließlich kommen wir an die Wurzel des Problems. Wenn Ihre Unterklasse einen expliziten Aufruf an auslässt Super
, und der Konstruktor Ihrer Superklasse hat die erforderlichen Parameter, dann den impliziten Aufruf an Super
liefert nicht die erforderlichen Parameter. Man könnte denken, dass ein Fehler bei der Argumentationsfehlernachfrage dies abfangen könnte. Da ActionScript jedoch nicht in der Lage ist, die Abweichung zu korrigieren, kann ActionScript nur das Fehlen eines Standardkonstruktors beklagen.
In unserem Beispiel, BustedBitmap
erweitern BitmapData
, welcher hat einen Konstruktor in der Dokumentation als so definiert:
BitmapData (width: int, height: int, transparent: Boolean = true, fillColor: uint = 0xFFFFFFFF)
Die ersten beiden Parameter sind erforderlich, und wir liefern sie nicht.
Die Lösung ist extrem einfach, wenn Sie das Problem verstanden haben. Sie müssen den Superkonstruktor explizit aufrufen, zumindest wenn erforderliche Parameter vorhanden sind. Mit anderen Worten, in unserem BustedBitmap
In dieser Klasse wird die folgende hervorgehobene Zeile das Problem beheben:
Paket import flash.display. *; public class BustedBitmap erweitert BitmapData public function BustedBitmap () super (600, 400); PerlinNoise (100, 100, 2, 1024, falsch, falsch, 7, wahr);
Und das wird es tun.
Als lehrbaren Moment möchte ich hinzufügen, dass es bei Erweiterungen einer anderen Klasse generell eine gute Idee ist, den expliziten Aufruf aufzunehmen Super
. Auch wenn keine Parameter vorhanden sind, erforderlich oder nicht (wie in Sprite
oder Filmausschnitt
) kann ein expliziter Aufruf die Absicht und das Bewusstsein für die Art der Unterklasse erklären. In der Praxis bieten explizite Aufrufe die Möglichkeit, Code vor dem Aufruf von auszuführen Super
, was in bestimmten Situationen hilfreich sein kann.
Noch ein weiterer Fehler wurde entmystifiziert; Die Herausforderung für dieses Problem besteht darin, dass die eigentliche Fehlerursache ziemlich verschüttet ist. Sobald Sie sich mit einer Schaufel vertraut gemacht haben, ist das Problem leicht genug.
Vielen Dank für das Lesen und bereit für weitere Debugging-Tipps.