2009-09-09 5 views
-1

При разработке в ActionScript 3 я часто нахожу, что ищу способ найти что-то похожее на то, что предлагаются магическими методами python __getattr__/__setattr__, чтобы иметь возможность перехватывать поиск атрибута на экземпляре и делать что-то обычное.Возможно ли перехватить атрибут get/setting в ActionScript 3?

Есть ли приемлемый способ достижения этого в ActionScript 3? В AS3 поиск атрибутов ведет себя несколько иначе для нормальных (запечатанных) и динамических классов - в идеале это будет работать одинаково для обоих случаев. В python это прекрасно работает для всех объектов (конечно!) Даже для подклассов самого dict!

ответ

0

Посмотрите объект flash.utils.Proxy.

класс Прокси-сервер позволяет переопределить поведение по умолчанию ActionScript операции (например, извлечение и модифицирующих свойств) на объекте.

+0

Я склонен забывать о flash.utils.Proxy - потому что вы можете использовать его только за счет расширения его. Это чрезмерно ограничивает ... учитывая, что AS3 не поддерживает множественное наследование, это делает невозможным использование Proxy - при расширении любого другого типа - для переопределения поведения GetProperty/setProperty. –

0

в as3 вы можете закодировать явные переменные. ex Class1:

частный var __myvar: String;

public function get myvar(): String {return __myvar; } public function set myvar (значение: String): void {__myvar = значение; }

Теперь, когда вы создаете экземпляр класса 1, вы можете получить доступ к __myvar через функции доступа. , если вы хотите установить bindable, что var вы должны поместить ключевое слово [Bindable] на один из его аксессуаров. далее, вы также можете реализовать приемник или сеттер, поэтому ваш var будет считан или записан только. я надеюсь, что это помогает;)

pigiuz

+0

Но что, если априори вы не знаете, какие свойства вам нужны? То есть динамические объекты, например. Объект, словарь? импорт flash.utils.Dictionary; var d: Словарь = новый словарь; d ["abc"] = 123; // как перехватить это свойство set? След (d ["abc"]); // как перехватить это свойство get? Все, все еще не теряя реальную природу базового объекта, то есть если словарь (или его подкласс) должен продолжать вести себя как один, то он все равно может делать все, что вы можете сделать с помощью Словаря, например. для перебора ключей: для (ключ var: объект в d) {трассировка (ключ, d [ключ]); } –

+0

в as3 это невозможно, если вы не написали аксессоры для каждого свойства (или вы используете путь прокси-объекта). грязным обходным путем можно написать класс-оболочку для каждого базового типа данных, что-то вроде MyInterceptorArray или MyInterceptorDictionary, где вы просто обертываете частный массив, словарь или что-то, что дает ему доступ через ваши handcrafted accessors. Здесь есть классная библиотека (http://code.google.com/p/as3ds), которая реализует такие структуры данных. as3 не является питоноязычным языком, он гораздо более похож на java-кодирование, а динамические объекты - в основном плохой способ программирования. – pigiuz

Смежные вопросы