AS3: избегать нескольких экземпляров одного и того же класса

Всем добрый вечер, и заранее спасибо за вашу мудрость.

Потерпите меня, если я покажу невежество, но вот как мой проект в настоящее время построен:

-TitleScreen: первый класс, который появляется. Расширяет спрайт. -Startup: класс, который я использую для вызова других классов. Расширяет спрайт. -GameScreen: класс "движка игры". Расширяет AssetsHandler. -AssetsHandler: где находится большинство методов управления активами. Расширяет GrfAssetsStore. -GrfAssetsStore: где хранятся все графические ресурсы. Расширяет спрайт. -Level01: класс первого уровня. Расширяет GameScreen.

Теперь: когда я запускаю все, все отлично. Итак, допустим, я заканчиваю уровень 1, и я хочу перезапустить, или перейти к титульному экрану: снова никаких проблем, НО я повторно создаю экземпляр класса GameScreen - и в свою очередь AssetsHandler, а в свою очередь GrfAssetsStore. Имейте в виду, что я не настраивал никаких EventListeners, которые вызывают их обратно - действительно, я пытался убедиться, что после запуска они останутся нетронутыми, но по моему невежеству я теперь понял, что перезапуск Level01, в свою очередь, повторно расширяется другие классы.

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

Цель в значительной степени состоит в том, чтобы GameScreen, AssetsHandler и GrfAssetsStore работали под капотом, так сказать, в то время как новые уровни начинаются и заканчиваются, но, в свою очередь, без перезапуска суперклассов, просто получая от них методы/переменные и т.д.

Итак: как мне преодолеть это? И нет, я не очень разбираюсь в AS3, поэтому я признателен, если это очевидно для настоящих экспертов, поэтому я здесь.

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

РЕДАКТИРОВАТЬ: теперь проблема, как мне кажется, не в расширении, а в том, что я неправильно разыменовываю переменные и т. д., спасибо Джошу за то, что он помог мне понять это. Как вы упомянули, нет смысла отрицать один из основных аспектов ООП: поэтому я определенно не должен рассматривать возможность применения этой неправильной логики.

Я попытаюсь улучшить GC (и принудительно GC, если это необходимо), пока не удалю правильно все ссылки. Если это не сработает... Я отправлю другой, более подробный вопрос.


person ReaperOscuro    schedule 02.10.2013    source источник
comment
почему именно повторное создание уровня 01 является проблемой? почему это нежелательно?   -  person Marton Pallagi    schedule 02.10.2013
comment
Перезапуск Level01 не является проблемой, так как я удалил из него все дочерние элементы перед перезапуском: проблема заключается в том, что расширенные классы вызываются повторно, дублируя все эти переменные классов, дочерние элементы, слушатели и т. д. и вызывая несогласованность и нагрузку на память.   -  person ReaperOscuro    schedule 04.10.2013


Ответы (1)


Вы можете настроить его как синглтон.

Базовая структура:

public class ClassName {

    private static var _instance:ClassName;
    public function ClassName() {
        // run normal constructor code here
    }

    public static function get instance():ClassName {
        if ( !_instance ) {
            _instance = new ClassName();
        }
        return _instance;
    }
}

Поэтому вместо того, чтобы вызывать new ClassName() в своем коде, вы просто вызываете ClassName.instance для доступа к одному экземпляру этого класса. Это будет каждый раз возвращать один и тот же экземпляр и создавать его, если он еще не создан. Это гарантирует, что в любой момент времени никогда не будет более одного экземпляра кода (при условии, что вы никогда не вызываете new ClassName(), конечно)

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

http://en.wikipedia.org/wiki/Singleton_pattern

person Josh    schedule 02.10.2013
comment
@Pier Хорошая находка. Документация Гранта Скиннера по AS3 — одна из лучших. - person Josh; 04.10.2013
comment
Спасибо, Джош, хотя, безусловно, использование функции для обхода лучшего аспекта ООП кажется глупым, я все равно посмотрю на нее и посмотрю, как я пойду. - person ReaperOscuro; 04.10.2013
comment
Еще раз спасибо, Джош, но мне действительно нужно убедиться, что я все еще сохраняю ООП, удаляя все необходимые ссылки. Я думаю, что, возможно, это настоящая проблема, а не что-то еще - я отредактировал свой вопрос и отметил ваш ответ как правильный, поскольку это помогло мне понять это. - person ReaperOscuro; 10.10.2013