Wie sich Klassen überschreiben
Juten Tach,
was passiert eigentlich, wenn zwei Movieclips in sich die gleiche Klasse kompiliert bergen und der eine Film den anderen lädt? Welche Klasse wird von welcher überschrieben? Das haben Lars und ich uns gefragt und folgendes herausgefunden:
Folgendes Szenario:
Wir erstellen einen Testordner, darin einen weiteren Ordner mit dem Namen ‘B’. Im Testordner selbst erstellen wir eine .fla mit dem Namen ‘A’ und im Ordner ‘B’ eine .fla mit dem simplen aber praktischen Namen ‘B’. Ausserdem erstellen wir im Testordner die Klasse mit dem Namen ‘Testklasse’. Sie enthält weiter nichts ausser ihrem Konstruktor, der selbst nichts anderes verrichtet, als: “Ich bin A” zu tracen. Die Klasse kopieren wir in den Ordner ‘B’ und ändern dort den trace zu: “Ich bin B”.
So, nun müssen wir noch dafür sorgen, dass in beiden .fla’s die jeweilige Klasse kompiliert wird, was man mit einem einfachen ‘Testklasse;’ erreicht. Zusätzlich muss Film A noch per createEmptyMovieClip und loadMovie Film B in sich hineinladen.
Flugs kompiliert das ganze, und was spuckt die Ausgabe aus: “Ich bin A”. Das ist mal interessant. Ein hineingeladener Film, der selber die gleiche Klasse in sich trägt, überschreibt die vorhandene Klasse des Hauptfilms nicht.
Das hätte uns fast gereicht, aber wir haben trotzdem noch was anderes getestet. Jetzt binden wir Film B mal als RuntimeSharedLibrary ein und was passiert nun: “Ich bin B”. Wär’ ja auch zu einfach gewesen. Klassen, die in einer RuntimeSharedLibrary sitzen, überschreiben sehr wohl ihre Doubles im Hauptfilm.
Das ist durchaus wichtig zu wissen, wenn man sich fragt, was man alles kompilieren muss, damit eine Änderung zu Tage tritt. Noch besser ist hier die Verwendung von exclude XML Dateien, die verhindern, dass bestimmte Klassen in bestimmte Filme kompiliert werden.
Exclude Dateien haben nur leider einen Haken: Wenn man eine bestimmte Klasse in einen Film kompilieren möchte, muss man auch immer alle Superklassen, von denen diese Klasse – auch indirekt – erbt, mit kompilieren. Sprich, man darf sie nicht exkludieren. Denn Flash kann sonst die Verknüpfung nicht mehr herstellen. Das gilt auch für Interfaces.
