Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.09.2012, 12:27
goldlider вне форума Посмотреть профиль Отправить личное сообщение для goldlider Найти все сообщения от goldlider
  № 1  
Ответить с цитированием
goldlider

Регистрация: Jun 2010
Сообщений: 120
По умолчанию Общение между двумя классами 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;
		}
	}
}

Старый 04.09.2012, 12:55
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 2  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Какую именно ошибку показывает компилятор? Вообще, судя по коду, здесь идет бесконечная рекурсия...

Старый 04.09.2012, 12:57
goldlider вне форума Посмотреть профиль Отправить личное сообщение для goldlider Найти все сообщения от goldlider
  № 3  
Ответить с цитированием
goldlider

Регистрация: Jun 2010
Сообщений: 120
Цитата:
Сообщение от maxkar Посмотреть сообщение
Какую именно ошибку показывает компилятор? Вообще, судя по коду, здесь идет бесконечная рекурсия...
Error: Game is a singletone class
at Game()[/Users/gadzimari/Documents/Adobe Flash Builder 4.6/lab/test/src/Game.as:28]


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

Старый 04.09.2012, 13:04
RigidFlasher вне форума Посмотреть профиль Отправить личное сообщение для RigidFlasher Найти все сообщения от RigidFlasher
  № 4  
Ответить с цитированием
RigidFlasher

Регистрация: Dec 2011
Сообщений: 70
Проблема в том, что вы генерируете ошибку, но нигде ее не перехватываете.
Нужно сделать что-то вроде этого
Код AS3:
try
{
	throw new Error("error!!!");
}
catch (e:Error)
{
	trace(e.message);
}
Здесь созданная вами ошибка перехватывается в блоке catch.

Старый 04.09.2012, 13:17
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 5  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
А у вас Game случайно не DocumentClass? Или на сцене он не валяется?

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

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

Старый 04.09.2012, 13:17
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Оно там ещё и стэк вызовов показывает - пройдитесь по нему, должны понять в чем фигня)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 04.09.2012, 13:24
goldlider вне форума Посмотреть профиль Отправить личное сообщение для goldlider Найти все сообщения от goldlider
  № 7  
Ответить с цитированием
goldlider

Регистрация: Jun 2010
Сообщений: 120
Цитата:
Сообщение от maxkar Посмотреть сообщение
А у вас Game случайно не DocumentClass? Или на сцене он не валяется?

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


1. Могут.
2. Сниглтоны - зло.
3. Зачем вам вообще ленивая иницаилизация? Хочу ответ от вас, зачем она сделана в данном конкретном случае.
В данном примере Game это document class и да он валяется на сцене. Для чего я это сделал, все просто т.к. это классы, которые создаются единожды. Как сделать, так чтобы эти два классы смогли контактировать?

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

Старый 04.09.2012, 13:30
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 8  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Код AS3:
Посмотрел, но честно говоря не догнал.
Проанализируйте внимательно цепочку вызовов, начиная с new Game();

Старый 04.09.2012, 13:32
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 9  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
В данном примере Game это document class и да он валяется на сцене.
Собственно вот.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 04.09.2012, 13:37
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 10  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
данном примере 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, время: 14:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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