Как получитьDefinitionByName класса без пакетов в AS3?

Скажем, у вас есть тест flexunit, который выглядит так:

package foo {
    import flexunit.framework.TestCase;
    import flash.utils.getDefinitionByName;
    import flash.utils.getQualifiedSuperclassName;
    class DescribeTypeTest {
      public function testDescribeInnerType():void {
        var currentInstance:ChildBar = new ChildBar();
        trace(getDefinitionByName(getQualifiedSuperclassName(currentInstance)));
      }
    }
}
class Bar{}
class ChildBar extends Bar{}

Что выдает исключение «Ошибка № 1065: переменная Bar не определена». Это относится только к внутренним классам (классам вне пакета).

У кого-нибудь есть способ заставить это работать?


person Community    schedule 16.06.2009    source источник


Ответы (2)


Не уверен, что есть обходной путь, но просто для подтверждения:

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

getDefinitionByName () function
public function getDefinitionByName(name:String):Object Язык версии: ActionScript 3.0 Версии среды выполнения: AIR 1.0, Flash Player 9 Возвращает ссылку на объект класса, указанный в параметре name.

Параметры

name:String — Имя класса. Возвращает объект — возвращает ссылку на объект класса класса, указанного параметром имени.

Выдает ReferenceError — общедоступного определения с указанным именем не существует.

Поскольку и Bar, и ChildBar не являются общедоступными, вы получаете ошибку ReferenceError.

person Juan Pablo Califano    schedule 17.06.2009

Я только что протестировал следующий код с помощью Flex 3.3 (приложение AIR):

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="t();">
    <mx:Script>
        <![CDATA[
            import flash.utils.describeType;
            import flash.utils.getQualifiedSuperclassName;
            private function t():void {
                trace(getDefinitionByName(getQualifiedSuperclassName(new FooBar())));
            }
        ]]>
    </mx:Script>
</mx:WindowedApplication>

Бар.ас

package
{
    public class Bar
    {
    }
}

FooBar.as

package
{
    public class FooBar extends Bar
    {
        public function FooBar()
        {
            super();
        }        
    }
}

В результате трассировки я вижу:

[SWF] DefTest.swf - 1,024,228 bytes after decompression
[class Bar]

Вы можете это подтвердить? Это помогает?

person Community    schedule 17.06.2009
comment
Не может быть внутри пакета. Дело в том, чтобы загрузить приватные (беспакетные) классы. - person ; 17.06.2009