Показать сообщение отдельно
Старый 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 Извиняюсь за большое кол-во кода, но по другому не выходило.