Schnelltipp So debuggen Sie einen AS3-Fehler Nr. 1203

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.


Schritt 1: Eine obligatorische, aber etwas nutzlose Beschreibung des Fehlers 1203

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.


Schritt 2: Ein kaputtes Projekt

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

  1. Eine FLA mit dem Namen Busted.fla. Es ist leer, aber mit der als nächstes beschriebenen Dokumentenklasse verknüpft.
  2. 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.

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

Schritt 3: Was ist dann alles??

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.


Schritt 4: Es ist so einfach wie…

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.


Schritt 5:… und das ist alles

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.