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

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

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

Регистрация: Jan 2009
Адрес: Одесса
Сообщений: 309
Отправить сообщение для Fatality с помощью ICQ
Question Взаимодействие статических классов с экземплярами не статических

Здравствуйте. Хотелось бы услышать совет от более опытных АС3-программистов.
Дело в том, что несмотря на имеющийся опят программирования как на АС3, так и на других ООП языках, меня не перестает мучить один вопрос: как же правильно организовать взаимосвязь экземпляров не статичных классов, с классами, которые не имеют экземпляров и содержат только статические методы и свойства.
Ниже рассматриваю вопрос подробнее, на примере моего кода:

Класс Root.as (DocmentClass):
Код AS3:
package {
	import flash.display.*;
	import flash.events.*;
	import flash.net.URLRequest;
	public class Root extends Sprite {
		public function Root():void {
			Connection.init(Const.SERVER_URL);
			btnLogin.addEventListener(MouseEvent.CLICK, btnLoginClickHandler);
			btnRoulette.addEventListener(MouseEvent.CLICK, btnRouletteClickHandler);
		}
		private function btnLoginClickHandler(event:MouseEvent = null):void {
			if (!Authentication.session) Connection.doAuthentication("login", "password");
		}
		private function btnRouletteClickHandler(event:MouseEvent = null):void {
			if (Authentication.session) Connection.doGameStart("EuropeRoulette", "private", "", 1);
		}
		private static function loadGame(strGame:String):void {
			var urlRequest = new URLRequest(strGame + ".swf");
			var ldrGameLoader:Loader = new Loader();
			ldrGameLoader.addEventListener(Event.COMPLETE, this.gameLoadedHandler);
			ldrGameLoader.load(urlRequest);
		}
		private function gameLoadedHandler(event:Event = null):void {
			var mc:MovieClip = event.target.loader as Loader;
			this.root.mcContainer.addChild(mc);
		}
	}
}
Класс Connection.as (Статичный класс):
Код AS3:
package {
	import flash.net.*;
	import flash.events.*;
	import com.adobe.serialization.json.*;
	public class Connection {	
		private static var _urlRequest:URLRequest;
		private static var _urlLoader:URLLoader;
		public static function init(strServerUrl:String):void {
			Connection._urlRequest = new URLRequest(strServerUrl);
			Connection._urlRequest.method = Const.SERVER_REQUEST_METHOD;
			Connection._urlRequest.contentType = Const.SERVER_REQUEST_CONTENT_TYPE;
			Connection._urlLoader = new URLLoader();
			Connection._urlLoader.addEventListener(Event.COMPLETE, Connection.serverResponseHandler);
		}
		private static function serverResponseHandler(event:Event = null):void {
			var objResponseData:Object = JSON.decode(event.target.data);
			Connection.serverResponseManager(objResponseData);
			//trace("Client JSON: " + event.target.data);
			Debug.traceObject("Server", objResponseData);
		}
		private static function serverResponseManager(objResponseData:Object):void {
			switch (objResponseData.action) {
				case Const.SERVER_COMMAND_LOGIN : 
					Authentication.session = objResponseData.session;
					Authentication.user = objResponseData.data.user;
					break;
				case Const.SERVER_COMMAND_START :
					Root.loadGame(objResponseData.data.game); //Это бред...
					//Здесь, пытаюсь загрузить .swf файл по имени
					break;
				default : trace("WTF " + objResponseData.action + " ?")
			}
		}
		public static function doAuthentication(strLogin:String, strPassword:String):void {
			var objRequest:Object = new Object();
			objRequest.unit = Const.SERVER_UNIT_LOBBY;
			objRequest.action = Const.SERVER_COMMAND_LOGIN;
			objRequest.data = new Object();
			objRequest.data.login = strLogin;
			objRequest.data.password = strPassword;
			Connection.doServerRequest(objRequest);
		}
		public static function doGameStart(strGame:String, strPrivacy:String, strArenaId:String, uintBetLimit:uint):void {
			var objRequest:Object = new Object();
			objRequest.unit = Const.SERVER_UNIT_GAME;
			objRequest.action = Const.SERVER_COMMAND_START;
			objRequest.session = Authentication.session;
			objRequest.data = new Object();
			objRequest.data.game = strGame;
			objRequest.data.gamedata = new Object();
			objRequest.data.gamedata.privacy = strPrivacy;
			objRequest.data.gamedata.betLimit = uintBetLimit;
			//objRequest.data.gamedata.arenaId = strArenaId;
			Connection.doServerRequest(objRequest);
		}
		public static function doServerRequest(objRequestData:Object):void {
			Connection._urlRequest.data = JSON.encode(objRequestData);
			Connection._urlLoader.load(Connection._urlRequest);
			//trace("Server JSON: " + JSON.encode(objRequestData));
			Debug.traceObject("Client", objRequestData);
		}
	}
}
Класс Root вызывает статические методы класса Connection, который отправляет запросы на сервер, он же получает ответ. Хотелось бы узнать, как теперь, например, из статического метода serverResponseManager, обратится к созданному в IDE клипу mcContainer. Ведь mcContainer — член экземпляра класс Root и мы не сможем обратится к нему из статического метода.

P.S Извиняюсь за большое кол-во кода, но по другому не выходило.

Старый 27.02.2010, 00:36
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Можно я буду наглым и прочитаю только название топа?

А теперь расскажите подробнее про "статические классы" и "не статические классы". В чем тут подвох?

ЗЫ. А! Я забыл спросить. Как Вы их различаете?
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 27.02.2010, 00:42
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 3  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
я тоже особо не читал, согласен с предыдущим оратором.

Цитата:
как теперь, например, из статического метода serverResponseManager, обратится к созданному в IDE клипу mcContainer
А как в обычном случае? Точно так же и в этом случае. (ссылку передать, собсна)

Старый 27.02.2010, 00:45
Fatality вне форума Посмотреть профиль Отправить личное сообщение для Fatality Найти все сообщения от Fatality
  № 4  
Ответить с цитированием
Fatality
 
Аватар для Fatality

Регистрация: Jan 2009
Адрес: Одесса
Сообщений: 309
Отправить сообщение для Fatality с помощью ICQ
Цитата:
Как Вы их различаете?
Да просто — Классы, которые не имеют экземпляров и содержат только статические методы и свойства.
Знаю, что формулировка неправильная, но не знаю я, как еще их назвать.

Добавлено через 3 минуты
Цитата:
ссылку передать, собсна
Ссылку говорите... да можно, но тогда уж проще в классе Root создать статическое свойство и назначить ему this. Но разве это правильный выход ?

Старый 27.02.2010, 00:53
ps_spectre вне форума Посмотреть профиль Отправить личное сообщение для ps_spectre Найти все сообщения от ps_spectre
  № 5  
Ответить с цитированием
ps_spectre
 
Аватар для ps_spectre

блогер
Регистрация: Jan 2010
Адрес: Киев
Сообщений: 156
Записей в блоге: 4
Отправить сообщение для ps_spectre с помощью Skype™
ага, тут надо разобраться еще, что такое оператор new ?
что он возвращает? (точно не возвращает объект)

собственно, я ничего против не имею, делайте как угодно.
только если все пихать в один класс, то получится anti-pattern.

Декомпозиция, инкапсуляция, полиморфизм и фсьо такое наш выбор. )

Старый 27.02.2010, 01:00
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Fatality Посмотреть сообщение
Да просто — Классы, которые не имеют экземпляров и содержат только статические методы и свойства.
Знаю, что формулировка неправильная, но не знаю я, как еще их назвать.
Эм. В as теоретически (at compile mode) все классы могут быть инстанцированы.
Но в runtime режиме приходится обламывать ненужное инстанцирование. Теперь ответьте, как понять, не забредая в документацию, что класс не может быть инстанцирован и, по-вашему он "статический"?

Ну невозможно в конкретный момент времени определить, что класс под воздействием
1076 (конкретно Math) или 2012 (более общий случай), не запустив приложение.

Как же тогда рассуждать о "статических" и "нестатических" классах?

По сути вопроса. Класс Connection подвешен в абсолютном ваккууме и абсолютно ничего не знает о других (объектах). Передайте ему ссылку на экземпляр чего-нибудь, что имеет ссылку (можно даже опосредованную) на экземпляр mcContainer.


Например, самое простое, в Connection передать ссылку на сам mcContainer.
Также можно закинуть ссылку на stage, а там по определенным правилам вытащить со stage сам mcContainer.

Добавлено через 11 минут
Цитата:
Сообщение от ps_spectre Посмотреть сообщение
ага, тут надо разобраться еще, что такое оператор new ?
что он возвращает?
Ругаться Вам еще рано.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 27.02.2010 в 01:08.
Старый 27.02.2010, 01:22
Fatality вне форума Посмотреть профиль Отправить личное сообщение для Fatality Найти все сообщения от Fatality
  № 7  
Ответить с цитированием
Fatality
 
Аватар для Fatality

Регистрация: Jan 2009
Адрес: Одесса
Сообщений: 309
Отправить сообщение для Fatality с помощью ICQ
Цитата:
Но в runtime режиме приходится обламывать ненужное инстанцирование. Теперь ответьте, как понять, не забредая в документацию, что класс не может быть инстанцирован и, по-вашему он "статический"?
Класс то может, но экземпляров не существует в принципе, т.к я их не создавал. Но это как я уже говорил — неточности формулировки.

Старый 27.02.2010, 01:31
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Прошу прощения, но если я не создаю экземпляров класса, то класс нужно считать статическим? Тогда, в принципе, не будет существовать его экземпляров, хехе, если их не создавать.

С другой стороны, если в конструкторе класса запрещено инстанцирование, то как понять Вышу фразу "Класс то может [... быть инстанцирован]"?
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 27.02.2010 в 01:36.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:34.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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