AS3 - Могу ли я узнать, реализует ли класс интерфейс (или является подклассом другого класса)? - PullRequest
9 голосов
/ 25 марта 2010

С этим кодом

function someFunction(classParam:Class):Boolean
{
    // how to know if classParam implements some interface?
}

т.е. Сравнение classParam с IEventDispatcher интерфейсом:

someFunction(EventDispatcher) // returns true
someFunction(Object) // returns false

Я знаю, что это невозможно сделать с оператором is. Но есть ли способ сделать это? Есть ли способ узнать, реализует ли класс какой-то интерфейс? (или является подклассом другого класса?)

Возможные решения:

A. Создание объекта classParam и использование этого объекта для сравнения с использованием оператора is.

function someFunction(classParam:Class):Boolean
{
    return (new classParam()) is IEventDispatcher
}

B. Использование describeType()

function someFunction(classParam:Class):Boolean
{
    var xml:XML = describeType(classParam)
    // found "implementsInterface" value in xml and compare to IEventDispatcher
}

Есть способ, который НЕ ИСПОЛЬЗУЕТ describeType или создает оператор new?

Ответы [ 4 ]

6 голосов
/ 25 марта 2010

Я не вижу способа добиться того, что вы пытаетесь сделать, кроме как с помощью describeType.
Он был создан для этой цели, почему бы вам не использовать его?

Edit:
На самом деле это займет всего 2 строки:

var classDescription:XML = describeType(classParam);
return (classDescription.factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0);

... или только в одном, если вас это беспокоит:

return (describeType(classParam).factory.implementsInterface.(@type == getQualifiedClassName(IEventDispatcher)).length() != 0);
1 голос
/ 25 марта 2010
0 голосов
/ 05 апреля 2015

Наверное, нет. Кстати, есть также describeTypeJSON, ведьма примерно в 5 раз быстрее, чем describeType.

0 голосов
/ 30 мая 2013

Добавление к ответу «Зед-К». Я закончил тем, что не нуждался в .факторной части. Вот пример теста, который проверяет, что класс использует и интерфейс. _instance - это тестируемый класс.

[Test]
public function testInstanceShouldBeIUser():void
{
    var classDescription:XML = describeType( _instance );
    var type:String = getQualifiedClassName(IUser);
    var xmlList:XMLList = classDescription.implementsInterface.(@type == type);
    assertTrue("expected IUser", xmlList.length() != 0 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...