Hier sind die Ergebnisse meiner eigenen Forschung im Detail:
Erweiterung der Klasse Klasse an sich unmöglich zu sein scheint, obwohl dies nirgends dokumentiert ist nicht gut, dass ich noch nicht gesehen habe.Aus meiner Untersuchung bin ich nun davon überzeugt, dass die Klasse Klasse selbst nicht alle Qualitäten enthält, die die anderen Top Level-Klassen haben, obwohl sie alle von der Klasse Object ausgehen.
Noch frustrierender ist die Tatsache, dass das Unterklassifizieren verschiedener Top Level-Klassen zu mehreren unterschiedlichen Fehlermeldungen führt, was es etwas schwierig macht zu sagen, welche Probleme auftreten. Um mit einem einfachen Beispiel zu beginnen, wenn Sie viele von Actionscript primitive Datentypen (int, uint, Zahl, String, Boolean usw.), Unterklasse versuchen, erhalten Sie die folgenden Compiler Fehler:
1016: Base class is final.
Dies macht Sinn , weil bei der Dokumentation für jede dieser Klassen suchen zeigt, dass sie in der Tat sind endgültig:
Package Top Level
Class public final class Boolean
Inheritance Boolean -> Object
Das letzte Stichwort, bedeutet natürlich, dass eine andere Klasse, die Klasse nicht erweitern kann als letzte markiert. Betrachten wir nun für ein komplizierteres Beispiel eine Erweiterung der Function-Klasse. Die Funktionsklasse ist gemäß den Dokumenten nicht endgültig. Da es nicht endgültig ist, bedeutet das, dass wir die Function-Klasse erweitern können, um eigene spezialisierte Funktionsobjekte zu erstellen? Hier ist eine Definition:
class MyFunction extends Function { /*...*/ }
.. und dann bei Laufzeit:
VerifyError: Error #1103: Class ::MyFunction cannot extend final base class.
dies vergleichen mit dem primitiven Datentyp Fehler oben. Dieser Fehler trat zur Kompilierungszeit auf, da die geerbte primitive Klasse tatsächlich als final markiert wurde. Die Funktionsklasse ist nicht markiert endgültig aber die Klasse verhält sich noch, als ob es war, nur zur Laufzeit.
Jetzt kommen wir zum Hauptproblem der Frage: Erweiterung der Klasse Klasse. Wie bei der Function-Klasse ist die Class-Klasse nicht final. Außerdem ist die Class-Klasse dynamisch, was bedeutet, dass neue Eigenschaften zu einem Klassenobjekt zur Laufzeit hinzugefügt werden können.
Als eine interessante Randbemerkung: Die Function-Klasse ist auch dynamisch, und ich glaube, dass dieser Teil von was die fortgesetzte Unterstützung der alten prototypischen Vererbungsmechanismen im ECMAscript-Dialekt ermöglicht. In diesem Dialekt werden Funktionen als Klassen einer Art (also als Prototypen) verwendet, und die Fähigkeit von Funktionen, Eigenschaften zur Laufzeit hinzuzufügen, ist Teil der Macht der prototypischen Vererbung.
Jetzt verstehe ich, dass Eigenschaften eines Klassenobjekts die gleichen sind wie statische Eigenschaften, die für jede Instanz dieser Klasse verfügbar sind. Daher sollte es logisch sinnvoll sein, dass jemand ein Klassenobjekt zur Laufzeit manipulieren möchte, um es ihnen zu ermöglichen, das Verhalten dieser Klasse und ihrer Instanzen zu ändern. Dass die Klasse Klasse dynamisch ist, verstärkt diese Vorstellung.
Da die Class-Klasse nicht endgültig ist, war ich gespannt, ob man die Class-Klasse erweitern, ihre eigene Spezialisierung des Class-Modells erstellen und irgendwo in der Meta-Language-Domain arbeiten kann. Ich werde für einen weiteren Tag die Diskussion darüber, warum jemand dies tun möchte, und welche Macht es hypothetisch erlauben würde, verlassen. Als abschließendes Beispiel wollen wir nun die Class-Klasse erweitern. Hier ist eine Definition:
// the definition causes no errors on its own, even though the compiler "sees" it
class MyClass extends Class { /*...*/ }
/* elsewhere */
MyClass; // the only mention of MyClass beyond the definition
..und dann bei Laufzeit:
verify global$init()
stack:
scope:
locals: global
/* snip about 120 lines */
46:getlex 34
stack: global Class$?
scope: global Object$ Class$
locals: global
48:newclass MyClass$cinit()
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
at global$init()
Heiligen stacktrace! Die VerifyError
ist für fehlerhafte SWF-Daten reserviert. Basierend auf dem, was ich finden konnte, neigt ein "Bug" im Flash Player dazu, sich zu manifestieren. In jedem Fall liegt dies etwas über einem normalen ActionScript-Fehler.
An diesem Punkt wird es ziemlich schwierig, genau zu verstehen, was passiert, aber das ist, was ich bisher ableiten konnte.
VerifyError: Error #1107: The ABC data is corrupt, attempt to read out of bounds.
I (fälschlicherweise, siehe unten Kommentar) glauben, dass „ABC“ steht für abstrakte Basisklasse, die ein Begriff Klassen angewandt wird, die nicht instanziiert werden kann, nur erweitert. Der obige erschreckende Fehler kommt jedoch nicht an einem Punkt der Instanziierung, sondern beim ersten Zugriff der Unterklasse MyClass Class. In der Tat, der Code des Beispiels, ich nie ein MyClass-Objekt instanziieren, ich beziehe mich nur auf die MyClass-Klasse selbst.
Ich habe ein paar weitere Tests durchgeführt und festgestellt, dass Klassenobjekte zumindest keine Konstruktoren zu haben scheinen, die normalerweise aus Objektunterklassen stammen. Wenn Sie einfach irgendwo in Ihrem Code new Class();
eingeben, wird dies gut demonstriert, aber Sie können dies weiter untersuchen, indem Sie die Eigenschaft .constructor
und andere Tricks untersuchen. Aus diesem Grund sind Instanzen der Klasse Class bestenfalls Objekte der zweiten Klasse, da sie zur Laufzeit nicht erstellt werden können.
Zuerst vermutete ich, dass dies die genaue Ursache meiner ekligen VerifyError
war. Ich glaube jedoch, dass es viele andere Elemente für eine Klasse gibt, die für unseren ActionScript-Code unsichtbar sind und die in der Klasse Class, der Function-Klasse oder an anderen merkwürdigen Stellen vorhanden sein können. Sicherlich, wenn der Flash Player versucht, auf einen der für die Erweiterung einer Basisklasse notwendigen zuzugreifen, und er existiert nicht (da Klasse möglicherweise ein ABC ist und somit bestimmte Elemente in einer normalen Klasse fehlen), könnte man durchaus erwarten um ein Out-of-Bounds zu sehen VerifyError
.
Zusammengefasst scheint die Erweiterung der Class-Klasse derzeit unmöglich zu sein. Es scheint, dass die Class-Klasse nicht alle Qualitäten enthält, die die meisten anderen Top Level-Klassen von Object erben, obwohl dies schwierig zu testen ist.
Ich würde es vorziehen, ein spezifischeres Fehlermeldungsergebnis zu sehen, wenn man Klasse erweitert, aber im Moment gibt es keine solche Sache. Ich würde gerne sehen, dass einige Metaprogrammierungsfunktionen in ActionScript zurückgegeben werden. Für jetzt ist es gut genug, um schlüssig zu wissen, dass es zumindest auf diese Weise nicht gemacht werden kann.
Die Hauptfrage ist: Ist Klasse eine Klasse? –
Nun, ich frage tatsächlich, ob Sie die Class-Klasse unterklassieren können, oder ob das ein Missbrauch des Klassenmodells ist. Ich weiß bereits, dass Klasse eine Klasse ist; Hier ist die Klasse class livedoc: http://help.adobe.com/de_DE/AS3LCR/Flash_10.0/Class.html – ivanreese
ein instanceof b // true –