PDA

Просмотр полной версии : getter и setter в динамическом классе


miramax
10.11.2006, 20:22
Как в рантайме создать поля геттеры и сеттеры ?

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
Странно что addProperty не задокументировано.... Да нашёл , merlin Twi переводил tip с использованием этой функции.
Из каких соображений в AS 3.0 все классы не наследуют Proxy ? Это бы добавило гибкости. Может Proxy ресурсоёмок?
Наверняка ресурсоёмок. Но могли бы сделать какой-нибудь debug mode, где вместо объекта при компиляции используется Proxy...

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

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

miramax
11.11.2006, 13:25
Расскажи плз эту длинную историю, может найдем более простой выходЗначит так, когда мы кодим что-то на флеше, часто возникает необходимость в том что бы какие-то свойства менялись плавно, или менялись земедленно, или менялись и колебались. Например шарик колеблещийся около курсора, при движении курсора этот шарик как на резинке следует за мышью. Бывает необходимость плавно, или с замедлением изменять альфа канал. Т.е. нам нужно плавно менять какие-то свойства. Например что бы плавно менять координату 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 любое свойство любого объекта ?
не дешевле будет продублировать нужные свойства нужных классов(так ли их много?) уже с этим функционалом и там где надо пользовать их, где не надо - 'родные' ?

etc
11.11.2006, 14:06
Не пойму, что за изврат, почему нельзя твинить само свойство?

miramax
11.11.2006, 14:43
Не пойму, что за изврат, почему нельзя твинить само свойство?
Причём тут твин? Я говорю об АС 3, о произвольных свойствах типа Number

etc
11.11.2006, 14:57
А «плавное изменение свойства» — это не твин?
Код, который ты продемонстрировал один к одному похож на Tween из AS2.

miramax
11.11.2006, 15:01
А «плавное изменение свойства» — это не твин?
Код, который ты продемонстрировал один к одному похож на Tween из AS2.
Твин напорядок тупее чем мне надо т.к. он не изменяет сеттер объекта, поэтому в АС 2 я бы заюзал addProperty, и твина нет в АС 3.

etc
11.11.2006, 15:05
Всё равно не понимаю, нафига нужны всякие addProperty, если свойство — простое?

Твин, в конце концов, можно написать самому.
А я даже подумываю насчёт порта на AS3, чем сейчас и займусь (может и изобретаю велосипед, но тем не менее).

miramax
11.11.2006, 15:07
А я даже подумываю насчёт порта на AS3, чем сейчас и займусь (может и изобретаю велосипед, но тем не менее).Что значит в данном контексте "порт" ?

FlexBuilder
12.11.2006, 14:58
Не. По любому надо пользовать Proxy. Иначе никак.
С произвольным объектом такое учинить можно только через какое-нибудь извращение типа


public class MyTween extends Sprite
{
private var _target:Object;
private var _speed:Number;
private var _value:Number;
private var _destination:Number;
private var _propName:String;

public function MyTween(obj:Object, propName:String, speed:Number) {
_speed = speed;
_target = obj;
_propName = propName;
_value = obj[propName];
addEventListener(Event.ENTER_FRAME, updateTween);
}


private function updateTween(event:Event):void {
if (_target[_propName] != _value) {
_destination = _target[_propName];
_target[_propName] = _value;
}
var delta:Number = _destination - _value;
if (Math.abs(delta) < _speed) {
_value = _destination;
} else {
_value += _speed * Math.abs(delta) / delta
}
_target[_propName] = _value;
}


}

Хотя... может кто уже нарыл аспектно-оринтированный фрейморк под AS3.0 :)

etc
12.11.2006, 19:10
miramax, я имел ввиду переписать Tween на AS3, но что-то стало лень)

miramax
12.11.2006, 21:31
miramax, я имел ввиду переписать Tween на AS3, но что-то стало лень)
Я написал что-то типа конвеера john'а на AS 3.0. Теперь изобретаю "художественные" изинги для него :) . Хочу внести ещё работу с событиями.

__i
14.11.2006, 14:12
нафига все эти извращения?

Помоемому проще сделать

inh = new Inhibitor();
var from: Number = anyObject.x
var to: Number = 50;
inh.inhibit(anyObject, 'x', from, to, inhibitFunction, param);
inh.start();


По типу как в твине было сделано. Во-первых не будешь мучаться и изобретать велосипед, во-вторых синтаксис знакомый всем кто юзал Tween

FlexBuilder
15.11.2006, 00:12
2 __i
Ну ему просто не охота писать лишние три строчки каждый раз, либо не хочется переписывать много существующего кода, что тоже можно понять :)

miramax
15.11.2006, 01:07
2 __i
Ну ему просто не охота писать лишние три строчки каждый раз, либо не хочется переписывать много существующего кода, что тоже можно понять :)
Да, очень много конструкций, в которых просто назначается свойство объекта.
obj.x = 100
Было бы идеально динамически назначать геттеры и сеттеры.
Что бы х менялось то плавно, то рывками.

__i
15.11.2006, 12:43
ну тут уже никуда не попрешь( что-то нужно делать, чего тебе не хочится. Сделай класс обертку для всех объектов которые будешь мучать типа:


public class ObjectWrapper implements IFlexDisplayObject
{
private var objectToWrap : *
public function ObjectWrapper(obj : Class)
{
objectToWrap = new obj()
}
public function set x(value : Number)
{
//тут идет твой метод который позволяет менять как нужно координату х у objectToWrap
}

.......
//дальнейшие методы которые нужно описать
.......
}


IFlexDisplayObject - для чтобы они всегда отвечали требованиям объектов компонент.

Хотя тоже гемор %)

FlexBuilder
16.11.2006, 14:01
2 __i для оберток как раз и используется Proxy

__i
16.11.2006, 14:32
2 __i для оберток как раз и используется Proxy

Как это не печально я еще не дошел разбора полетов с Proxy (((,
Моя любовь с компонентами наследоваными от ListBase затянулась...

FlexBuilder
17.11.2006, 02:48
Ну ты подумай хорошенько.
Вдруг Proxy <love/> тебя