switch … case mit Klassentypen
Hin und wieder muss ich in Flash zur Laufzeit Prüfen welchen Typ meine Klasse hat. Adobe hat dafür verschiedene Methoden in ActionScript3 implementiert.
Am zuverlässigsten funktioniert der “is“-Operator. Dieser prüft, ob ein Objekt zu einem spezifischen Datentyp, einer Klasse oder einem Interface kompatibel ist. Als Rückgabewert gibt es ein “true” oder “false“.
Dies bedeutet, dass die Funktion auch dann “true” liefert, wenn das Objekte die zu prüfende Klasse als Elternklasse enthält. In manchen Fällen müssen viele verschiedene Klassen geprüft, und darauf aufbauen Entscheidungen im Programmablauf getroffen werden. Dies würde bedeuten, dass für jede mögliche Klasse ein “if” – Block mit dem “is” – Operator implementiert werden muss. Es wäre schön an dieser Stelle mit einem “switch .. case” – Block arbeiten zu können.
Dafür bietet sich die Funktion ”getQualifiedClassName()” an. Diese Funktion liefert den kompletten Klassennamen inklusive dem Paketnamen als “String” zurück: “paket::Klassenname“. Aus diesem String kann nun der Klassenname extrahiert werden. Durch einen einfachen Stringvergleich ist es damit möglich, den Type der Klasse zu prüfen. Diese Methode hat gegenüber dem “is” Operator einige Nachteile. So liefert diese Methode auch dann den Wert “false” wenn das zu prüfende Objekt die gesucht Klasse erweitert oder ein entsprechendes Interface implementiert. Wiederum liefert diese Methode “true” wenn Klassen aus unterschiedlichen Paketen aber mit selben Namen geprüft werden sollen.
Stellen diese Nachteile innerhalb der Programmierung kein Problem dar, kann mit dieser Methode ein entsprechender “switch … case” Block aufgebaut werden. Folgender CodeBlock kann dadurch umgewandelt werden:
if (object is Class1) {}
else if (object is Class2) {}
else if (object is Class3) {}
else if ((object is Class4)|| (object is Class5)) {}
wird zu
var class_name:String = getQualifiedClassName(object);
class_name = class_name.substring(class_name.search("::")+2);
switch (itemClass){
case "Class1":break;
case "Class2":break;
case "Class3":break;
case "Class4":
case "Class5":break;
}
Noch keine Kommentare vorhanden.