Причина использования экземпляра stage вместо вызова 'stage'? - PullRequest
0 голосов
/ 06 октября 2011

Боюсь, что я могу обдумать это, а также не знаю, какие ключевые слова я должен использовать, чтобы найти больше информации.Излишне говорить, что мои поиски оказываются бесполезными.Я хотел бы знать, есть ли причина, по которой в классе AS3 я хотел бы сделать что-то вроде этого:

var myStageInstance:Stage;

//within an arbitrary class
var myStageInstance:Stage = stage;
myStageInstance.addEventListener(MouseEvent, someFunction);

, а не то, что я обычно делал бы:

//within an arbitrary class
stage.addEventListener(MouseEvent, someFunction);

Нет особой проблемы, которую я сейчас хочу решить. Я просто хотел бы знать, есть ли причина использовать один метод над другим.

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Да, есть причины поддерживать ссылку на сцену.Один из примеров - если вы добавляете прослушиватели событий на сцену и должны быть уверены, что они будут очищены в будущем или хотите получить прямой контроль над событиями. Вот пример:

public class Demo
{
    private var _stage:Stage;

    public function Demo()
    {
        super();
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
    }

    public function destroy():void
    {
        if (_stage)
        {
            _stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            _stage.removeEventListener(Event.MOUSE_LEAVE, onMouseLeave);
            _stage = null;
        }
    }

    private function onAddedToStage(event:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        _stage = stage;

        _stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true);
        _stage.addEventListener(Event.MOUSE_LEAVE, onMouseLeave, false, 0, true);
    }

    private function onMouseMove(event:MouseEvent):void
    { /* Do something */ }

    private function onMouseLeave(event:Event):void
    { /* Do something */ }
}
2 голосов
/ 06 октября 2011

следующий код не будет работать, он не работает, поскольку myStageInstance имеет значение null, пока вы не назначите ему что-либо.

var myStageInstance:Stage;
//within an arbitrary class
myStageInstance.addEventListener(MouseEvent, someFunction);

//You need to do 
var myStageInstance:Stage = stage;
myStageInstance.addEventListener(MouseEvent, someFunction);

//this is more preferred as it is a lot less code. 
stage.addEventListener(MouseEvent, someFunction);
0 голосов
/ 06 октября 2011

Ваш код не должен работать, поскольку вы ничего не устанавливаете в свой stageInstance.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...