Гибкая ошибка "Типовое приведение" при приведении к интерфейсу - PullRequest
0 голосов
/ 16 июля 2009

Это ошибка, которую я получаю в handleModuleReady функции:

[Fault] exception, information=TypeError: Error #1034: Type Coercion failed: 
can not convert MyModule@39b8479 to IModuleInterface.

У меня есть настройка приложения, и я создал модули для загрузки во время выполнения, чтобы уменьшить размер файла (поскольку большинству пользователей когда-либо понадобится только один из модулей).

<!-- maker.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
  xmlns="*"
  layout="absolute" 
  creationComplete="init(event)">
<mx:Style source="css/maker.css" />
<mx:Script>
<![CDATA[
    //Modules
    import mx.events.ModuleEvent;
    import mx.modules.ModuleLoader;
    import mx.modules.ModuleManager;
    import mx.modules.IModuleInfo;

    private var info:IModuleInfo;

    ...
    private function init(e:Event):void {
        info = ModuleManager.getModule("MyModule.swf");
        info.addEventListener("ready", handleModuleReady);
        info.addEventListener("error", handleModuleError);
        info.load(ApplicationDomain.currentDomain);
    }

    private function handleModuleReady(moduleEvent:ModuleEvent):void {
        var ichild:IModuleInterface = IModuleInterface(moduleEvent.target.factory.create());
        if (ichild != null) {
          //call class functions here via ichild object
        }
        else {
          trace("Something has gone wrong.");
        }
    }
...
</mx:Script>
...

Я создал класс IModuleInterface (IModuleInterface.as), и файл MyModule.mxml компилируется без проблем, но я продолжаю получать ошибку при наборе типов, несмотря на попытки применения различных потенциальных решений, таких как загрузка модуля через ModuleLoader, ModuleManager, и совсем недавно настройка приложения домен.

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

Если уместно, интерфейс выглядит примерно так.

//IModuleInterface.as
package
  {
    public interface IModuleInterface {
    function getSomeClass():Class;
    function getSomeArray():Array;
    function getSomeInt():int;
  }
}

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Во-первых, если вы хотите сравнить ichild с нулем, вы должны использовать as, чтобы выполнить приведение:

var ichild:IModuleInterface = moduleEvent.target.factory.create() as IModuleInterface;

Во-вторых, можете ли вы подтвердить, что create () возвращает экземпляр модуля (а не то, что его упаковывает)? Судя по вашей ошибке, это так.

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

Дайте мне знать, как это происходит.

0 голосов
/ 16 июля 2009

Я неправильно прочитал вопрос

Попробуйте это:

var module :IModuleInterface = evt.module.factory.create() as IModuleInterface;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...