Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Взаимодействие статических классов с экземплярами не статических (http://www.flasher.ru/forum/showthread.php?t=136849)

Fatality 27.02.2010 00:20

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

dimarik 27.02.2010 00:36

Можно я буду наглым и прочитаю только название топа?

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

ЗЫ. А! Я забыл спросить. Как Вы их различаете?

ps_spectre 27.02.2010 00:42

я тоже особо не читал, согласен с предыдущим оратором.

Цитата:

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

Fatality 27.02.2010 00:45

Цитата:

Как Вы их различаете?
Да просто — Классы, которые не имеют экземпляров и содержат только статические методы и свойства.
Знаю, что формулировка неправильная, но не знаю я, как еще их назвать.

Добавлено через 3 минуты
Цитата:

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

ps_spectre 27.02.2010 00:53

ага, тут надо разобраться еще, что такое оператор new ?
что он возвращает? (точно не возвращает объект)

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

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

dimarik 27.02.2010 01:00

Цитата:

Сообщение от Fatality (Сообщение 889626)
Да просто — Классы, которые не имеют экземпляров и содержат только статические методы и свойства.
Знаю, что формулировка неправильная, но не знаю я, как еще их назвать.

Эм. В as теоретически (at compile mode) все классы могут быть инстанцированы.
Но в runtime режиме приходится обламывать ненужное инстанцирование. Теперь ответьте, как понять, не забредая в документацию, что класс не может быть инстанцирован и, по-вашему он "статический"?

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

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

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


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

Добавлено через 11 минут
Цитата:

Сообщение от ps_spectre (Сообщение 889629)
ага, тут надо разобраться еще, что такое оператор new ?
что он возвращает?

Ругаться Вам еще рано.

Fatality 27.02.2010 01:22

Цитата:

Но в runtime режиме приходится обламывать ненужное инстанцирование. Теперь ответьте, как понять, не забредая в документацию, что класс не может быть инстанцирован и, по-вашему он "статический"?
Класс то может, но экземпляров не существует в принципе, т.к я их не создавал. Но это как я уже говорил — неточности формулировки.

dimarik 27.02.2010 01:31

Прошу прощения, но если я не создаю экземпляров класса, то класс нужно считать статическим? Тогда, в принципе, не будет существовать его экземпляров, хехе, если их не создавать.

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


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

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