Форум 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=166552)

Dukobpa3 04.09.2011 04:48

Можно ли как-то в оверрайде изменить кол-во принимаемых параметров функции?
 
Короче запилил гломурную систему автообновления моделей при получении данных с сервера.
Строится дерево моделей, данные плюются в корневую и она рекурсивно обновляет всё что внутри нее.

Код AS3:

                /**
                * Пропихивает данные полученные с сервера по веткам моделей.
                * @param data
                */

                protected function updateData(data:Object):void
                {
                        for (var key:String in data) // проходим по каждому ключу данных
                        {
                                if (_data.hasOwnProperty(key)) // если в дате есть такой ключ
                                {
                                        if (_data[key] is BaseDataModel) // и если этот ключ является BaseDataModel
                                        {
                                                _data[key].updateData.call(this, data[key]) // значит в нем должен быть метод автоапдейта. Запускаем его
                                        }
                                        else
                                        {
                                                _data[key] = data[key]; // Иначе данные принимаем за базовый тип и просто приравниваем
                                        }
                                }
                                else // если же такого ключа нету
                                {
                                        updateNoKey(key, data[key]); // то запускаем функцию занимающуюся обновлением без ключей.
                                }
 
                                update(key); // Кричим во вьюху что изменили параметр.
                        }
                }
 
                /**
                * Оверрайдим там где надо.
                * @param        key
                * @param        data
                */

                protected function updateNoKey(key:Object, data:Object):void
                {
                        trace(key);
                        _data[key] = data;
                }

Вот как-то так.
Не конает только в том случае если данные вот здесь: updateData(data:Object) являются одним параметром из словаря по иду.

Ну т.е. вот словарь:
Код:

{
        "users":
                {
                        "bdc2f7d3e41640da8c66722641387b3e":
                                {
                                        "ingame":"36e0e36b-d404-4178-9979-daf6cf1a5a69"
                                },
                        "f44f40619a8f4865972ac5df06387aef":
                                {
                                        "ingame":false
                                },
                        "3ce5ab7aa4674235ab36f857f5f2227d":
                                {
                                        "ingame":"36e0e36b-d404-4178-9979-daf6cf1a5a69"
                                }
                }
               
}

А вот сюда: updateData(data:Object)
Пихаем вот это:
Код:

                        "3ce5ab7aa4674235ab36f857f5f2227d":// Вот этот кусок, тобишь ид как таковой мы в принимаемом обжекте не видим
                                {// а видим только его значение.
                                        "ingame":"36e0e36b-d404-4178-9979-daf6cf1a5a69"
                                }

Вот как-то так. Так вот в такой ситуации надо передавать кроме самого обжекта еще и ид.
И это надо довольно-таки редко. Потому вводить ид в базовый класс ради парочки ситуаций неохота. Было бы удобно оверрайдить функцию автоапдейта и чтоб она еще и ид принимала и что-то там нахимичить. Но оверрайд соответственно должен быть клоном того что именно мы оверрайдим.

Пока что не вижу решений кроме как задать какой-то дефолтный ид даже там где его не надо, и чтоб и дальше автоматом делалось так как сейчас делается.

MXPain 04.09.2011 05:31

Код AS3:

protected function updateData(data:Object, id:*=""):void

и оверрайди сколько угодно

Dukobpa3 04.09.2011 14:32

Спасибо Кеп. Я об этом писал:
Цитата:

Пока что не вижу решений кроме как задать какой-то дефолтный ид даже там где его не надо
З.Ы. Задачу эту уже решил другим образом, но вопрос остается в силе.

Bgg 04.09.2011 14:44

То что вы хотите называется перегрузкой методов, и в AS3 такого нет. Можно ещё выкрутиться так:
Код AS3:

manyParams("a");
manyParams("a","b");
//...
private function manyParams (... args): void {
        for each (var p:Object in args) {
                trace (p);
        }
}


Dukobpa3 04.09.2011 14:48

Хм. Спасибо, про ...args забыл что-то.


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

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