describeType()
jest bardzo powolny, mówiąc komputerowo. Jeśli musisz określić łańcuch dziedziczenia nieprzypisanych klas, rozważ użycie opcji Class.prototype
i prototype.isPrototypeOf()
. To pozwala ci sprawdzić dziedziczenie i równość, jeśli wszystko, co masz, to same Klasy (w przeciwieństwie do obiektu będącego instancją tej Klasy).
Jeśli masz tylko ciąg reprezentujący nazwę klasy (w przeciwieństwie do samej klasy), musisz najpierw przekonwertować ją na właściwą klasę, używając flash.utils.getDefinitionByName()
, zakładając, że co najmniej zadeklarowałeś klasę gdzieś w swoim kodzie . Jeśli klasa istnieje tylko w załadowanej bibliotece SWF, być może trzeba użyć czegoś takiego jak ApplicationDomain.currentDomain.getDefinitionByName()
lub contextLoader.currentDomain.getDefinitionByName()
.
Oto działający przykład, który akceptuje albo klasy lub nazwy klasy String i sprawdza, czy pierwszy jest w łańcuchu dziedziczenia drugiego.Dodatkowy argument pozwala ci zdecydować, czy chcesz zwrócić wartość false, jeśli dwie klasy są identyczne, a nie pierwsze, wydłużając drugie.
/**
* Determines whether the childClass is in the inheritance chain of the parentClass. Both classes must be declared
* within the current ApplicationDomain for this to work.
*
* @param childClass
* @param parentClass
* @param mustBeChild
*/
public static function inheritsFrom(childClass:*, parentClass:*, mustBeChild:Boolean = false) {
var child:Class,
parent:Class;
if (childClass is Class) {
child = childClass;
} else if (childClass is String){
child = getDefinitionByName(childClass) as Class;
}
if (! child) {
throw new ArgumentError("childClass must be a valid class name or a Class");
}
if (parentClass is Class) {
parent = parentClass;
} else if (parentClass is String){
parent = getDefinitionByName(parentClass) as Class;
}
if (! parent) {
throw new ArgumentError("parentClass must be a valid class name or a Class");
}
if (parent.prototype.isPrototypeOf(child.prototype)) {
return true;
} else {
if (mustBeChild) {
return false;
} else {
if (parent.prototype === child.prototype) {
return true;
}
}
}
return false;
}
Świetnie, dzięki. Opierając się na bogatym API Java 6, musiałem cały czas wymyślać kółko za pomocą Flash/Flex, grrr ;-). – jmdecombe
To jest dobre, ale stosunkowo powolne. Jeśli robisz to od czasu do czasu, nic ci nie jest. W przeciwnym razie rozważ "isPrototypeOf()". –