У меня возникла проблема с попыткой загрузить внешне определенные классы в actionscript 3.0.Я считаю, что это проблема с моим пониманием классов ApplicationDomain / LoaderContext, но даже после просмотра документации и нескольких поисков в Интернете я все еще застрял.
По сути, я хочу загрузитьSWF, который содержит символ, который является реализацией интерфейса, совместно используемого вызывающим SWF и загруженным SWF.Я могу нормально загружать SWF, создавать экземпляры и выполнять на нем методы, но только до тех пор, пока не попытаюсь привести его к общему типу интерфейса.Если я пытаюсь его привести, я получаю TypeError: Ошибка № 1034: Ошибка приведения типа: ошибка типа.
Я подозревал, что это происходит потому, что при загрузке нового класса flash распознает его как совершенно другой классотсюда и исключение.Документация предлагает использовать аргумент LoaderContext, для которого для applicationDomain установлено значение ApplicationDomain.currentDomain.
Проблема в том, что это не имеет никакого эффекта.Независимо от того, установлен ли для ApplicationDomain значение currentDomain, null или дочерний элемент текущего домена, я все равно получаю ошибку приведения типа.Кажется, что :: часть ошибки указывает, что загруженный класс находится в другом пространстве имен или в каком-то другом, когда я хочу, чтобы он находился в том же пространстве имен, что и мой загрузчик.
Код:
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
public class TestSkin extends MovieClip
{
var mLoader:Loader;
public function TestSkin()
{
super();
startLoad("ExternalTest.swf");
}
private function startLoad(url:String):void
{
mLoader = new Loader();
var mRequest:URLRequest = new URLRequest(url);
var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;
//Loading into different domains seems to have no effect
//var appDomain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
//var appDomain:ApplicationDomain = null;
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.load(mRequest, new LoaderContext(false, appDomain));
}
private function onCompleteHandler(loadEvent:Event):void
{
//Get the object from the loadEvent
var obj:Object = loadEvent.target.content;
//Verify that the methods exist on the object
trace("Loaded item id: " + obj.getInterfaceId());
//This returns Loaded item id: ExternalTestInterfaceImplementation!
//Try assigning as an instance of the shared type - fails with type coercion error
//Throws the following type error:
//TypeError: Error #1034: Type Coercion failed: cannot convert myPackage::ExternalTestInterfaceImplementation@257b56a1 to myPackage.TestInterface.
var castItem:TestInterface = TestInterface(obj);
trace("castItem: " + castItem);
}
}
Объявление интерфейса:
public interface TestInterface
{
function getInterfaceId():String;
}
Реализация интерфейса
public class ExternalTestInterfaceImplementation extends MovieClip implements TestInterface
{
public function getInterfaceId() : String
{
return "ExternalTestInterfaceImplementation!";
}
public override function toString():String
{
return getInterfaceId();
}
}