Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   getter и setter в динамическом классе (http://www.flasher.ru/forum/showthread.php?t=87757)

miramax 10.11.2006 20:22

getter и setter в динамическом классе
 
Как в рантайме создать поля геттеры и сеттеры ?

Dendroid 10.11.2006 21:18

addProperty(prop:String, getFunc:Function, setFunc:Function) : Boolean ?
Только придётся от Proxy наследоваться...

Dendroid 10.11.2006 21:23

Если без Proxy, у динамических классов всё созданное паблик будет...

miramax 10.11.2006 21:34

Странно что addProperty не задокументировано.... Да нашёл , merlin Twi переводил tip с использованием этой функции.
Из каких соображений в AS 3.0 все классы не наследуют Proxy ? Это бы добавило гибкости. Может Proxy ресурсоёмок?

miramax 10.11.2006 21:40

Хочу создавать сеттеры в рантайме, как это было в АС 1/2. У класса Object было addProperty , а теперь нужно что-то вымудрять через Proxy. Может кто-то нашёл наиболее рациональный выход?
Зачем ? О... это долгая история :)

Dendroid 10.11.2006 21:43

Цитата:

The Proxy class is a replacement for the Object.__resolve and Object.addProperty features of ActionScript 2.0, which are no longer available in ActionScript 3.0. The Object.addProperty() feature allowed you to dynamically create get and set methods in ActionScript 2.0. Although ActionScript 3.0 provides get and set methods at compile time, you cannot dynamically assign one to an object unless you use the Proxy class.
Такой облом. ;)

Dendroid 10.11.2006 21:46

Цитата:

Сообщение от miramax
Странно что addProperty не задокументировано.... Да нашёл , merlin Twi переводил tip с использованием этой функции.
Из каких соображений в AS 3.0 все классы не наследуют Proxy ? Это бы добавило гибкости. Может Proxy ресурсоёмок?

Наверняка ресурсоёмок. Но могли бы сделать какой-нибудь debug mode, где вместо объекта при компиляции используется Proxy...

__i 11.11.2006 13:02

Цитата:

Сообщение от miramax
Хочу создавать сеттеры в рантайме, как это было в АС 1/2. У класса Object было addProperty , а теперь нужно что-то вымудрять через Proxy. Может кто-то нашёл наиболее рациональный выход?
Зачем ? О... это долгая история :)

Расскажи плз эту длинную историю, может найдем более простой выход

miramax 11.11.2006 13:25

Цитата:

Сообщение от __i
Расскажи плз эту длинную историю, может найдем более простой выход

Значит так, когда мы кодим что-то на флеше, часто возникает необходимость в том что бы какие-то свойства менялись плавно, или менялись земедленно, или менялись и колебались. Например шарик колеблещийся около курсора, при движении курсора этот шарик как на резинке следует за мышью. Бывает необходимость плавно, или с замедлением изменять альфа канал. Т.е. нам нужно плавно менять какие-то свойства. Например что бы плавно менять координату x, на нужно писать большой кусок кода с функцией которая вызывается по событие enterFrame и делает много всяких проверок. У меня сейчас в проекте таких элементов штук 50, где альфу надо плавно сменить, где координаты, в барчартах - надо плавно менять высоту. То есть , это какие-то объекты, возвращающие тип Number и эти намберы надо плавно менять. Возникла идея написать класс ингибитор, который позволяет ставить функции замедления на какие-либо свойства. Юзинг этого класса я представляю себе так:
Код:

inh = new Inhibitor();
inh.inhibit(anyObject, 'x', inhibitFunction, param)
anyObject.x = 50;

То есть класс ингибитор имеет статичный метод inhibit который в любом объекте замедляет изменение любого свойства. В моём примере первый аргумент - объект, второй - свойство в этом объекте, третий - функция ингибирования, которая будет вызываться по enterFrame, остальные аргументы - какие-топараметры для функции ингибирования. После этого, свойство х плавно меняет своё значение, от кадра к кадру. Достаточно один раз написать функцию ингибирования, простота написания кода существенно возрастёт.
Но, вот в чём проблема. На мой объект anyObject уже имеется туча ссылок, этот объект много где юзается. То есть изменение свойства х, из любой точки программы долно вызвать плавное изменение х.
Самым разумным ,на мой взягляд, выходом было сделать следующее:
после вызова метода, класс inhibitor копирует геттер и сеттер свойства х куда-нибудь, например в геттеры и сеттеры свойства temp (что бы можно было потом его менять), потом ингибитор вставляет на место свойства х геттеры и сеттеры, которые вызывают функцию ингибирования, которая в свою очередь плавно меняет свойство temp. Бредятина конечно, но на АС 1/2 это реализовать несложно, а вот с тройкой проблемы.
Создание нового прокси объекта-обёртки, который будет перехватывать свойства, не очень удачный выход. Т.к. старые ссылки на объект будут по-прежнему менять оригинальное свойство скачкообразно.

silin 11.11.2006 13:48

т.е. ты хочешь иметь возможность подписывать/отписывать на inhibit любое свойство любого объекта ?
не дешевле будет продублировать нужные свойства нужных классов(так ли их много?) уже с этим функционалом и там где надо пользовать их, где не надо - 'родные' ?


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

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