2009-11-07 2 views
5

В ActionScript 3, вы можете выяснить, является ли объект вывода класса С или класса, который расширяет или реализует класс C (прямо или косвенно) с использованием ...Как правильно проверить наследование классов в ActionScript 3?

if (O is C) { 
    ... 
} 

То, что я хочу сделать, это проверьте, распространяется ли класс CC или реализует класс C (прямо или косвенно) без необходимости создания экземпляра объекта.

В Java, вы бы использовать ...

if (C.isAssignableFrom (CC)) { 
    ... 
} 

http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)

Как насчет ActionScript 3?

Спасибо!

ответ

3

Вы можете вызвать describeType() на CC непосредственно. Вам не нужно создавать экземпляр объекта.

Это не так чисто, как хотелось бы, но я не могу найти ничего лучшего.

(через Amarghosh: [http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType()][1])

+1

Отлично, спасибо. Исходя из богатого API Java 6, мне приходится постоянно изобретать колесо с помощью Flash/Flex, grrr ;-). – jmdecombe

+0

Это хорошо, но относительно медленно. Если вы просто делаете это время от времени, вы в порядке. В противном случае рассмотрим 'isPrototypeOf()'. –

1

Я думаю, вам придется вручную разобрать через объект XML, возвращенного flash.utils.describeType

+0

Невозможно определить тип, просто взглянув на класс (за исключением использования 'flash.utils.describeType'). Вы можете сделать это, только сначала создав объект. –

+0

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#describeType() – Amarghosh

+0

* круглые скобки являются частью ссылки – Amarghosh

0

В качестве альтернативы, если вы используете as3commons-reflect пакет (который очень, очень полезно, кстати), вы можете позвонить:

ClassUtils.getImplementedInterfaces(CC) 
0

Worth включая Spicelib reflection библиотека как другой альтернатива. Конкретно ClassInfo.isType.

Проверяет, является ли класс или интерфейс представлен этим экземпляром ClassInfo является подклассом или Субинтерфейс из указанного класса

ClassInfo.forClass(A).isType(B); 
0

Вот хак я только что нашел. Не уверен, насколько он тверд, но он работает для меня.

var child:Child = getChild() as Parent; 
if(child != null) { 
    ... 
} 
-1

describeType() очень медленно, с вычислительной точки зрения. Если вам необходимо определить цепочку наследования неинтересных классов, рассмотрите возможность использования Class.prototype и prototype.isPrototypeOf(). Это позволяет проверять наследование и равенство, если все, что у вас есть, это сами классы (в отличие от объекта, который является экземпляром этого класса).

Если у вас есть только строковое представление имени класса (в отличие от самого класса), вам необходимо сначала преобразовать его в соответствующий класс, используя flash.utils.getDefinitionByName(), предполагая, что вы хотя бы объявили класс где-то в вашем коде , Если класс существует только в загруженной библиотеке SWF, вам, возможно, придется использовать что-то вроде ApplicationDomain.currentDomain.getDefinitionByName() или contextLoader.currentDomain.getDefinitionByName().

Вот рабочий пример, который принимает имена классов или строк и проверяет, находится ли первая в цепочке наследования второй.Дополнительный аргумент позволяет вам решить, хотите ли вы возвращать значение false, если два класса идентичны, а не первый, расширяющий второй.

/** 
* 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; 
} 
Смежные вопросы