Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ХML: Запретить создавать любые аттрибуты, кроме нужных? (http://www.flasher.ru/forum/showthread.php?t=113256)

wvxvw 23.06.2008 15:59

ХML: Запретить создавать любые аттрибуты, кроме нужных?
 
Поскольку наследовать от ХМЛя низзя (но иногда очень бы хотелось... =) Возникает вопрос, как можно было бы организовать такую штуку:
Существует под-формат ХМЛя позволяющий только определенные имена тэгов / аттрибутов + регламентирующий, что в этих аттрибутах может быть. Но ради реализации этого формата не хочется придумывать ХМЛ еще раз, а использовать его возможности... С именами элементов проблему решил следующим образом: класс динамический, и когда у него пытаются создать свойство, названия которого нет в списке - выдает ошибку. А вот сделать то же самое с аттрибутами не получается - т.как обращение к аттрибуту типа @attributeName для не ХМЛ/ХМЛЛиста вызовет ошибку...
Есть какие-нибудь идеи по этому поводу?

divinus 23.06.2008 16:53

есть такой паттерн, "обертка" называется, почитай про него, как вариант... )
паттерны

ulik 24.06.2008 14:22

wvxvw я вас не совсем понял... Что-то типа такого вы хотите:

Код:

package
{
        public class LimitedXMLList
        {
                private var _data:XMLList = new XMLList("<doc><node /></doc>");
                private var supportedNames:Array = [ "id", "login", "password" ];
                private var numNames:int = supportedNames.length;
                private var hasValue:Boolean;
               
                public function LimitedXMLList()
                {
                        super();
                }
               
                public function addParam(varName:String, varValue:String):Boolean
                {
                        hasValue = false;
                        for(var i:int = 0; i<numNames; i++)
                        {
                                if(supportedNames[i] == varName)
                                {
                                        hasValue = true;
                                        break;
                                }
                        }
                        if(!hasValue)
                        {
                                throw new Error("Unsupported varName = '"+varName+"'. Supported names: "+supportedNames, 0);
                                return false;
                        }
                        _data.node..@[varName] = varValue;
                        return true;
                }
               
                public function get data():XMLList
                {
                        return _data;
                }
        }
}

Код:

import LimitedXMLList;

var myList:LimitedXMLList = new LimitedXMLList();
myList.addParam("id", "659");
myList.addParam("login", "Ivan");
myList.addParam("password", "test");
myList.addParam("someVar", "someValue"); // Error: Unsupported varName = 'someVar'. Supported names: id,login,password
trace(myList.data);

После первых трех add'ов:
Цитата:

<doc>
<node id="659" login="Ivan" password="test"/>
</doc>

vooparker 24.06.2008 15:01

Проблема насколько я понимаю заключается в том, что хочется сделать свой тип, который будет поддерживать @ - оператор доступа к атрибуту. ActionScript в нынешней своей версии не позволяет подобно с++ прописывать поведение операторов, честно не знаю как правильно это назвать, так что знающие люди поправьте.

Например, у нас есть класс Vector, одна из возможных операций это складывание векторов. В ActionScript нет возможности использовать конструкцию vector1 + vector2, поскольку + оператор сложения, который можно применять для строк, чисел и тд. Но нет возможности заставить этот оператор правильно сложить два экземпляра класса Vector. Поэтому реализовать данную операции можно только через создание соответствующего метода.

Здесь насколько я понимаю ситуация схожая, есть желание использовать оператор @ для не XML или XMLList объектов. Собственно и реализация может быть только в виде метода.

wvxvw 24.06.2008 15:19

ulik:
Да, мысль примерно правильная, только так делать очень нееффективно...

vooparker
Угу, в итоге все закончилось написанием своего ХМЛ-подобного класса (вернее группы классов) и использованию $ вместо @.

ulik 24.06.2008 15:36

wvxvw >> Ну, эт ясно. Я просто, чтоб понять точно о чем речь. А вообще vooparker прав. Жаль, что нельзя...

badun 24.06.2008 15:55

Цитата:

Сообщение от wvxvw (Сообщение 747531)
Угу, в итоге все закончилось написанием своего ХМЛ-подобного класса (вернее группы классов) и использованию $ вместо @.

Зачем? Ты же Proxy испульзуешь, обращайся нормально через @, а внутри проверяй что передано через isAttribute.

wvxvw 24.06.2008 20:13

если бы... Флеш не воспринимает @ после точки как строку... т.е. я не смогу обнаружить, обращаюсь ли я к аттрибуту или к ноду...
т.е. getProperty() видит customProxy.@attr и customProxy.attr одинаково... (как будто @ там нету)

edited: а, ой, сорри про isAttribute не заметил =) вот млин, а я мучался =)
Млин, даж нинаю, прям обрадовался... а ларчик то просто открывался =)


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

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