У меня возникла проблема с попыткой загрузить классы, определенные извне, в ActionScript 3.0. Я считаю, что это проблема с моим пониманием классов ApplicationDomain/LoaderContext, но даже после прохождения документации и нескольких веб-поисков я все еще застрял.Actionscript 3 loading external swf casting issue
По существу, я хочу загрузить swf, содержащий символ, который представляет собой реализацию интерфейса, разделяемого вызывающим swf и загруженным swf. Я могу загрузить swf fine и создавать экземпляры и выполнять на нем методы, но только до тех пор, пока я не пытаюсь передать его в тип общего интерфейса. Если я попытаюсь выполнить его, я получаю TypeError: Error # 1034: Тип Coercion failed: введите ошибку.
Я подозревал, что это связано с тем, что, когда я загружаю новую флеш-память класса, она распознает ее как совершенно другой класс, поэтому исключение. documentation предлагает использовать аргумент 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::[email protected] 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();
}
}
Могли бы вы вставить точное сообщение об ошибке? –
Несомненно. Я пропустил номер строки из-за импорта и т. Д., Но могу точно сказать, что ошибка выдается в строке var castItem: TestInterface = TestInterface (obj); TypeError: Error # 1034: Type Coercion failed: невозможно преобразовать myPackage :: ExternalTestInterfaceImplementation @ 29b4e6a1 в myPackage.TestInterface. – user432437