Сравните два интерфейса, используя "is" - PullRequest
3 голосов
/ 07 октября 2011

Я не уверен, что я что-то здесь упускаю. Я хотел бы сравнить два класса, которые используют один и тот же interface. Это возможно? Я понимаю, что оператор is сравнивает классы, но есть ли подобная функция при использовании интерфейсов?

// works
var effect1 : CrazyEffect = new CrazyEffect();
var effect2 : SaneEffect = new SaneEffect();

trace(effect1 is effect2) // false

// does not work
var effect1 : ISoundEffect = new CrazyEffect();
var effect2 : ISoundEffect = new SaneEffect();

trace(effect1 is effect2)

1067: неявное приведение значения типа ISoundEffect к несвязанному типу Class.

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Обратите внимание на различия между понятиями класса и объекта. Первый является типом данных, тогда как второй является его экземпляром во время выполнения, переменной. is оператор не может сравнивать одну переменную с другой.

Согласно языковой справке

is Оператор

Оценивает, совместим ли объект с конкретным типом данных , класс или интерфейс . Используйте оператор is вместо instanceof оператор для сравнения типов . Вы также можете использовать оператор is для проверьте, реализует ли объект интерфейс.

Другими словами, компилятор ожидает, что первый операнд будет переменной , тогда как второй операнд должен быть идентификатором типа .

var sample:String = "Object is an instance of a class.";
     ^^^    ^^^
variable    type identifier  

Однако effect2 это не идентификатор типа, а переменная. Отсюда и сообщение об ошибке.

К сожалению, нет универсального оператора для проверки общности интерфейса. Единственная альтернатива:

trace((s is ISoundEffect) && (t is ISoundEffect));

Обновление

Проверить, являются ли объекты экземплярами одного и того же класса, можно путем сравнения имен классов:

if (getQualifiedClassName(effect1) == getQualifiedClassName(effect2)) {
   // true
}

Подробное обсуждение см. В Получите класс, используемый для создания экземпляра объекта в AS3

1 голос
/ 09 октября 2011

Несмотря на то, что он будет работать с getQualifiedClassName, есть лучший способ проверить, являются ли два объекта экземплярами одного и того же класса:

a['constructor'] === b['constructor']

getQualifiedClassName очень медленный и интенсивно использует процессор.Поскольку приведенный выше код просто сравнивает значения свойств, он работает молниеносно.И да, constructor является свойством каждого объекта, однако FB будет жаловаться, если вы попытаетесь получить к нему доступ с помощью точечной нотации, поэтому я использую динамический доступ к свойству.

...