|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Взаимодействие статических классов с экземплярами не статических
Здравствуйте. Хотелось бы услышать совет от более опытных АС3-программистов.
Дело в том, что несмотря на имеющийся опят программирования как на АС3, так и на других ООП языках, меня не перестает мучить один вопрос: как же правильно организовать взаимосвязь экземпляров не статичных классов, с классами, которые не имеют экземпляров и содержат только статические методы и свойства. Ниже рассматриваю вопрос подробнее, на примере моего кода: Класс Root.as (DocmentClass): 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); } } } 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); } } } P.S Извиняюсь за большое кол-во кода, но по другому не выходило. |
|
|||||
.
|
Можно я буду наглым и прочитаю только название топа?
А теперь расскажите подробнее про "статические классы" и "не статические классы". В чем тут подвох? ЗЫ. А! Я забыл спросить. Как Вы их различаете? |
|
|||||
я тоже особо не читал, согласен с предыдущим оратором.
Цитата:
|
|
|||||
Цитата:
Знаю, что формулировка неправильная, но не знаю я, как еще их назвать. Добавлено через 3 минуты Цитата:
|
|
|||||
ага, тут надо разобраться еще, что такое оператор new ?
что он возвращает? (точно не возвращает объект) собственно, я ничего против не имею, делайте как угодно. только если все пихать в один класс, то получится anti-pattern. Декомпозиция, инкапсуляция, полиморфизм и фсьо такое наш выбор. ) |
|
|||||
.
|
Цитата:
Но в runtime режиме приходится обламывать ненужное инстанцирование. Теперь ответьте, как понять, не забредая в документацию, что класс не может быть инстанцирован и, по-вашему он "статический"? Ну невозможно в конкретный момент времени определить, что класс под воздействием 1076 (конкретно Math) или 2012 (более общий случай), не запустив приложение. Как же тогда рассуждать о "статических" и "нестатических" классах? По сути вопроса. Класс Connection подвешен в абсолютном ваккууме и абсолютно ничего не знает о других (объектах). Передайте ему ссылку на экземпляр чего-нибудь, что имеет ссылку (можно даже опосредованную) на экземпляр mcContainer. Например, самое простое, в Connection передать ссылку на сам mcContainer. Также можно закинуть ссылку на stage, а там по определенным правилам вытащить со stage сам mcContainer. Добавлено через 11 минут Ругаться Вам еще рано. Последний раз редактировалось dimarik; 27.02.2010 в 01:08. |
|
|||||
Цитата:
|
|
|||||
.
|
Прошу прощения, но если я не создаю экземпляров класса, то класс нужно считать статическим? Тогда, в принципе, не будет существовать его экземпляров, хехе, если их не создавать.
С другой стороны, если в конструкторе класса запрещено инстанцирование, то как понять Вышу фразу "Класс то может [... быть инстанцирован]"? Последний раз редактировалось dimarik; 27.02.2010 в 01:36. |
Часовой пояс GMT +4, время: 22:50. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|