2013-10-02 3 views
0

Проведите вечер, и заблаговременно за вашу мудрость.AS3: избегайте нескольких экземпляров того же класса

медведь со мной, если я показываю невежество, но вот как мой проект в настоящее время построено:

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

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

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

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

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

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

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

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

+0

почему именно reinstantiating level01 проблема? почему это нежелательно? –

+0

Перезапуск Level01 не является проблемой, так как я удалил из него всех детей перед перезапуском: проблема заключается в том, что расширенные классы получают повторное вызов, дублируя все эти переменные классов, дочерние элементы, слушатели и т. Д., Вызывая несогласованность и память бремя – ReaperOscuro

ответ

1

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

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

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

+1

http://gskinner.com/blog/archives/2006/07/as3_singletons.html – Pier

+0

@Pier Хорошая находка. Документация AS3 от Grant Skinner является одной из лучших. –

+0

Спасибо, Джош, хотя абсолютно, используя функцию, чтобы обойти лучший аспект ООП, кажется глупым, я все равно дам ему gander и посмотрю, как я пойду. – ReaperOscuro

Смежные вопросы