PDA

Просмотр полной версии : Как узнать принадлежность к интерфейсу?


Genzo
21.10.2011, 13:15
Есть ли метод, чтобы узнать имплементирует ли класс заданный интерфейс?
Можно describeType парсить, но очень не хочется.
А :

(MyClass is IMyClasses) == false

GBee
21.10.2011, 13:16
Создать экземпляр, проверить и убить

smithy
21.10.2011, 15:42
Либо так (http://stackoverflow.com/questions/2518180/as3-can-i-know-if-a-class-implements-an-interface-or-is-a-subclass-of-another/2518534#2518534)

var classDescription:XML = describeType(MyClass);
trace(classDescription.factory.implementsInterface.(@type == getQualifiedClassName(IMyClasses)).length() != 0);

Правда, это очень медленно.

etc
21.10.2011, 23:39
IMyClass.prototype.isPrototypeOf(MyClass.prototype)

dimarik
21.10.2011, 23:42
trace(IEventDispatcher.prototype.isPrototypeOf(EventDispatcher.prototype));// false

etc
21.10.2011, 23:44
Чьорт, ну тогда придётся парсить:

import flash.display.IBitmapDrawable;
import flash.utils.getQualifiedClassName;
var className:String = getQualifiedClassName(IBitmapDrawable);
trace(describeType(Sprite).factory.implementsInterface.(@type == className).length() > 0);

dimarik
21.10.2011, 23:58
Аха, сплошная рефлексия. Вроде к 11 ее сделали даже в джонсоне (JSON).

etc
22.10.2011, 00:01
Вы хотели сказать в обычном объекте?
Так это можно и в десятке получить.

gloomyBrain
22.10.2011, 00:52
Интересно, а чисто гипотетически - откуда у интерфейса прототип? Он же не подразумевает реализацию.

etc
22.10.2011, 00:57
Мне кажется, это последствия следования стандарту ECMAScript.

gloomyBrain
22.10.2011, 01:03
Тогда вообще странно - получается, что у объекта может быть целое дерево прототипов, вместо последовательной цепочки. Я к тому, что может я и мало знаком с ECMA, но вроде должна быть именно линейная цепочка по стандарту

etc
22.10.2011, 01:07
Ну, судя по всему, конкретно интерфейсы в цепочку не входят.

gloomyBrain
22.10.2011, 01:18
Кстати, и не образуют. Даже если один интерфейс наследуется от другого - для виртуальной машины это все набор отдельных интерфейсов.

Wolsh
22.10.2011, 02:38
Хм. Разве не это заключено в понятии "реализует"? Интерфейсы описывают экземпляр, а не Класс. Поэтому в них нельзя описать static методы. Класс только обещает, что его, Класса, реализации – экземпляры – будут и реализациями Интерфейса. Но сам то он не реализует методов, описанных в интерфейсе. У самого класса их (статических) – нет.
То, что сами интерфейсы не создают цепочек, вполне логично, ведь реально никаких связей между звеньями нет: нет оверрайдов, нет взаимных вызовов и нет общих переменных – то есть всех тех нюансов, которые учитываются при наследовании классами. Соответственно искусственное создание какой-то структуры избыточно.