2012-02-23 3 views
2

У меня есть основное приложение, которое содержит ModuleManager. Это приложение загружает различные модули. Как основное приложение, так и загруженные модули используют мой собственный RSL. Мне нужно получить объект класса в моем RSL, который определен в одном из модулей. Я пытаюсь использовать функцию getDefinitionByName, но поскольку мой класс не определен в RSL, я получаю исключение (хотя модуль с необходимым классом загружен). Можно ли сделать классы модулей видимыми для кода RSL и получить экземпляр его во время выполнения без изменения структуры проекта? СпасибоgetDefinitionByName() и видимость класса

+0

Я думаю, что нужно добавить 'import' заявление в верхней части вашего класса для' getDefinitionByName 'работать. –

+0

@Laurent мой RSL ничего не знает о модулях, я не могу использовать его при компиляции –

+0

Возможно, вы загружаете модули в неправильный домен приложения, чтобы получить доступ с помощью getDefinitionByName из RSL. Было бы разумно, чтобы каждый модуль загружался в уникальный, чтобы избежать столкновений классов. –

ответ

1

Вы можете ввести определение класса, если вы выставляете свойство в модуле (или его интерфейсе) типа Class, аналогично тому, как определения классов вводятся в кнопки для создания значков.

Таким образом, ваш модуль может иметь такой код:

protected var _classToMake:Class; 

public function get classToMake():Class { 
    return _classToMAke; 
} 

public function set classToMake(value:Class):void { 
    if (value != _classTomake) { 
     if (value != null) { 
     //test to make sure we're making the right thing 
     var testClass:SomeType = new value() as SomeType; 
     if (testClass != null) { 
      _classToMake = value 
     } else { 
      trace('classToMake must be a definition that makes a class of SomeType'); 
     } 
     } 
    } 
} 
1

При загрузке нового модуля, указать домен приложения. Как указано в документе:

"The ApplicationDomain class is a container for discrete groups of class definitions." 

Вы указываете домен приложения как часть контекста загрузчика при загрузке SWF.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html

После того, как у вас есть ссылка на домен приложения, что модуль загружается в, вы можете вызвать getDefinition() метод домена приложения, чтобы получить определение, во многом таким же образом, как getDefinitionByName()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#getDefinition()

Также см. Следующий документ «Работа с областями применения» для отличного описания того, как они работают.

http://help.adobe.com/en_US/as3/dev/WSd75bf4610ec9e22f43855da312214da1d8f-8000.html

А вот копия пасты примера, просто упаковывают есть отвлекается:

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 

    public class ApplicationDomainExample extends Sprite 
    { 
     private var ldr:Loader; 
     public function ApplicationDomainExample() 
     { 
      ldr = new Loader(); 
      var req:URLRequest = new URLRequest("Greeter.swf"); 
      var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
      ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
      ldr.load(req, ldrContext);  
     } 
     private function completeHandler(event:Event):void 
     { 
      var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; 
      var myGreeter:Greeter = Greeter(event.target.content); 
      var message:String = myGreeter.welcome("Tommy"); 
      trace(message); // Hello, Tommy 
     } 
    } 
} 
Смежные вопросы