Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Общение между двумя классами Singletone (http://www.flasher.ru/forum/showthread.php?t=183886)

goldlider 04.09.2012 12:27

Общение между двумя классами Singletone
 
Собственно не могу понять, в чем ошибка. Компилятор показывает на строчку throw new Error("Game is a singletone class");


Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Game extends Sprite
        {
                private static var _allowInstantiation:Boolean = true;
                private static var _instance:Game;
 
                private var _hud:HUD;
 
                public static function get instance():Game
                {
                        if (!_instance)
                        {
                                _allowInstantiation = false;
                                _instance = new Game();
                                _allowInstantiation = true;
                        }
 
                        return _instance;
                }
 
                public function Game()
                {
                        if (_allowInstantiation)
                        {
                                throw new Error("Game is a singletone class");
                        }
                        initialize();
                }
 
                private function initialize():void
                {
                        _hud = HUD.instance;
                        addChild(_hud);
                }
        }
}

Код AS3:

package
{
        import flash.display.Sprite;
 
        public class HUD extends Sprite
        {
                private static var _allowInstantiation:Boolean = true;
                private static var _instance:HUD;
 
                private var _game:Game;
 
                public static function get instance():HUD
                {
                        if (!_instance)
                        {
                                _allowInstantiation = false;
                                _instance = new HUD();
                                _allowInstantiation = true;
                        }
 
                        return _instance;
                }
 
                public function HUD()
                {
                        if (_allowInstantiation)
                        {
                                throw new Error("HUD is a singletone class");
                        }
                        initialize();
                }
 
                private function initialize():void
                {
                        _game = Game.instance;
                }
        }
}


maxkar 04.09.2012 12:55

Какую именно ошибку показывает компилятор? Вообще, судя по коду, здесь идет бесконечная рекурсия...

goldlider 04.09.2012 12:57

Цитата:

Сообщение от maxkar (Сообщение 1094792)
Какую именно ошибку показывает компилятор? Вообще, судя по коду, здесь идет бесконечная рекурсия...

Error: Game is a singletone class
at Game()[/Users/gadzimari/Documents/Adobe Flash Builder 4.6/lab/test/src/Game.as:28]


Неужели два синглтон-класса не мог обращаться друг к другу?

RigidFlasher 04.09.2012 13:04

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

try
{
        throw new Error("error!!!");
}
catch (e:Error)
{
        trace(e.message);
}

Здесь созданная вами ошибка перехватывается в блоке catch.

maxkar 04.09.2012 13:17

А у вас Game случайно не DocumentClass? Или на сцене он не валяется?

Если ответ на хотя бы один из вопросов "да", вам нужно немного переписать flash-player и плагины (для firefox и ie), чтобы они создавали документ не с использованием new <document class>, а через <document class>.instance (если таковой найдется). При этом могут перестать работать другие флешки.

Цитата:

Неужели два синглтон-класса не мог обращаться друг к другу?
1. Могут.
2. Сниглтоны - зло.
3. Зачем вам вообще ленивая иницаилизация? Хочу ответ от вас, зачем она сделана в данном конкретном случае.

-De- 04.09.2012 13:17

Оно там ещё и стэк вызовов показывает - пройдитесь по нему, должны понять в чем фигня)

goldlider 04.09.2012 13:24

Цитата:

Сообщение от maxkar (Сообщение 1094797)
А у вас Game случайно не DocumentClass? Или на сцене он не валяется?

Если ответ на хотя бы один из вопросов "да", вам нужно немного переписать flash-player и плагины (для firefox и ie), чтобы они создавали документ не с использованием new <document class>, а через <document class>.instance (если таковой найдется). При этом могут перестать работать другие флешки.


1. Могут.
2. Сниглтоны - зло.
3. Зачем вам вообще ленивая иницаилизация? Хочу ответ от вас, зачем она сделана в данном конкретном случае.

В данном примере Game это document class и да он валяется на сцене. Для чего я это сделал, все просто т.к. это классы, которые создаются единожды. Как сделать, так чтобы эти два классы смогли контактировать?

Цитата:

Сообщение от -De- (Сообщение 1094798)
Оно там ещё и стэк вызовов показывает - пройдитесь по нему, должны понять в чем фигня)

Посмотрел, но честно говоря не догнал.

udaaff 04.09.2012 13:30

Код AS3:

Посмотрел, но честно говоря не догнал.

Проанализируйте внимательно цепочку вызовов, начиная с new Game();

GBee 04.09.2012 13:32

Цитата:

В данном примере Game это document class и да он валяется на сцене.
Собственно вот.

maxkar 04.09.2012 13:37

Цитата:

данном примере Game это document class и да он валяется на сцене.
Ну значит переписывайте плеер. Или сделайте отдельный документ-класс, который создает game и добавляет ее в список отображения.

Цитата:

Для чего я это сделал, все просто т.к. это классы, которые создаются единожды.
Третий вопрос был не про это. Третий вопрос был про ленивую инициализацию. Зачем вам там ленивая инициализация? Почему не создавать public static const instance : Game = new Game(...)? Или вы взяли пример кода и не разбирались, что он делает? Такой номер не пройдет. Кроме того, "все классы создаются единожды" - это недостаточная причина для создания singleton'а. Самым простым решением будет создать по одному экземпляру класса и не мучиться. Так как вам все равно создавать новый документ-класс, в его конструкторе можно создать Game, Hud и передать одному ссылку на другого (один - в конструкторе, другой - через setter).

Цитата:

Как сделать, так чтобы эти два классы смогли контактировать?
Передавайте им обычные ссылки. Через параметры конструктора. Через сеттеры и т.п. И вообще, какую задачу (большую, два синглтона - способ ее решения) вы пытаетесь решить? Зачем ваш hud хочет Game? Наверное, ему достаточно какого-то четко выделенного интерфейса. И hud'у без разницы, будет его реализовывать Game или кто-то еще. Ладно, еще понятно, зачем Game может понадобиться Hud. Ну сделайте фабрику, пусть Game вызывает craeateHud(this), когда ей понадобится (первый раз) hud. И вообще, в этом случае hud будет жить только внутри game (что правильно), а не своей собственной жизнью.


Часовой пояс GMT +4, время: 05:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.