Управление синглетонами во внешних SWF-файлах - PullRequest
2 голосов
/ 22 марта 2011

Я имею дело со сценарием, в котором мой код может быть включен в другой контент Flash, либо включен через команды import .as, а затем упоминается как Singleton, например,

import com.as3.Singleton;
...
...

Singleton.birth();
Singleton.getInstance().test();

... но также импортируется как библиотека времени выполнения; с классом Singleton, предварительно экспортированным как .swf (вместо предварительной выпечки класса).

Как мне ссылаться на Singleton после того, как Event.COMPLETE сработал из загрузчика, который вводит SWF? Обычно я бы написал что-то вроде:

public function singletonCompleteHandler(event:Event):void {    
var mySing:Singleton = _loader.contentLoaderInfo.content as Singleton;
}

... но я знаю, что не хочу ссылаться на синглтон через ссылку "var". Я не очень хорошо объясняю, но, по сути, после загрузки файла singleton.swf мне нужно использовать код внутри него в одноэлементной модели (т. Е. Убедиться, что в моем приложении есть только один его экземпляр).

Копия класса Singleton, включенного ниже (кстати, спасибо за любые мысли по этому поводу).

package
{
    public class Singleton extends Sprite
    {
        private static var instance:Singleton;

        public function Singleton() {
            if (instance) {
                throw new Error("Singleton can only be accessed through Singleton.getInstance()");
            }
        }

        public static function birth() {
            if (instance == null) {
                instance = new Singleton();
            }
        }

        public static function getInstance():Singleton {
            return instance;
        }

        public function test():void {
            trace("Testing our singleton.");
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 22 марта 2011

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

Так что япредполагаю, что вы хотите сделать что-то вроде этого:

function completeHandler(event:Event):void
{
    var singleton:Object = loader.contentLoaderInfo.content;

    var instance:IMyObject = singleton.getInstance();
    instance.test();
}

IMyObject здесь, конечно, необязательно.Если вы сделаете это так, ваш экземпляр-синглтон должен будет реализовать IMyObject.

interface IMyObject
{
    function test():void;
}

. Это все, чтобы не ссылаться на фактический класс в загружаемом SWF-файле.Как я уже сказал, интерфейс является необязательным: вместо него можно использовать Object.

... а теперь перейдем к главному: загрузите одноэлементный SWF-файл в собственный «домен приложения» загружаемого SWF-файла.

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/LoaderContext.html#applicationDomain

var lc:LoaderContext = new LoaderContext();
lc.applicationDomain = ApplicationDomain.currentDomain;

loader.load(new URLRequest("Singleton.swf"), lc);

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

1 голос
/ 22 марта 2011

Если ваш вопрос «Как я должен ссылаться на Singleton после того, как Event.COMPLETE сработал из загрузчика, который загружает SWF?», То вы можете сделать это с помощью:

var Singleton:Object = _loader.contentLoaderInfo.applicationDomain.getDefinition('Singleton');

Но,Я не уверен, что вы имеете в виду, когда не хотите использовать ссылку "var".

В дополнение к этому, есть большая вероятность, что глобальная переменная будет лучшим вариантом, чем класс Singleton для API..

package myPackage
{
    public var myGlobal:MyGlobal = new MyGlobal();
}

К которым вы можете получить доступ myPackage.myGlobal

...