|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Modus ponens
|
Прокси класс не может реализовать интерфейс?
Ситуация такая:
есть класс наследующийся от прокси, у него есть метод foo(), и существует вероятность, что у него же будет свойство foo. Теперь, если мы попробуем сделать так: proxyInstance["foo"], то getProperty не сработает... вместо этого нам вернется ссылка на метод foo()... Это можно избежать переделав все методы в приватные и в callProperty вызывать приваные методы вместо пабликов... но в таком случае класс не будет реализовывать нужный интерфейс... методы помещенные в другой неймспейс не считаются имплементаторами... Может у кого-то есть идеи по поводу как побороть?
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Mar 2008
Сообщений: 215
|
А если просто кастануть объект к интерфейсу, в котором объявлено свойство, и потом явно обратиться castedProxyInstance.foo, - проблема не решится?
|
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Цитата:
incoob, каст вернет null в таком случае. |
|
|||||
стервочка (я мужик)
|
а причём тут прокси и имплемантация вообще? просто метод foo тоже является свойством типа Function.
код ниже возвращает ошибку |
|
|||||
Modus ponens
|
Ну да... а как ты например реализуешь IEventDispatcher и так, чтобы у прокси могло быть свойство addEventListener например =/ И уже если это и дефект архитектуры - то не мой... я же не пытался вызвать метод... это как бы совсем не "предсказуемое" поведение... я бы ожидал, что методы не числились бы в качестве свойств...
Не, Блуд, речь не об этом... речь о том, я ожидал другое поведение... т.е. сначала попытаться найти свойство, а если свойства нет, то тогда уже смотреть в методах... Да и собственно, не суть важно в чем конкретно ошибка... ну вот нужно мне, чтобы был proxy IEventDispatcher со свойством addEventListener, а не методом...
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.03.2009 в 18:00. |
|
|||||
Регистрация: Mar 2008
Сообщений: 215
|
Я не знал о существовании flash.utils.Proxy и подумал на паттерн Proxy. Удивился конечно, что во флеше как-то можно делать функции с одним и тем же именем, ну да ладно, чего на свете не бывает... Подумал я так из-за
Цитата:
Я немного модифицировал стандартный пример и вот что получилось: package { import flash.display.Sprite; public class ProxyExample extends Sprite { public function ProxyExample() { var arr:ProxyArray = new ProxyArray(); /* arr.push(1); arr.push(-2); arr.push(3); arr.push(4); arr.push("five"); trace(arr.length); // 5 trace(arr[0]); // 1 trace(arr[1]); // -2 trace(arr[2]); // 3 trace(arr[3]); // 4 trace(arr.sum()); // 6 arr.clear(); trace(arr); // (empty string) arr[0] = "zero"; trace(arr); // zero */ trace(arr.push) trace(arr.push()) } } } import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class ProxyArray extends Proxy { private var _item:Array; public function ProxyArray() { _item = new Array(); } override flash_proxy function callProperty(methodName:*, ... args):* { var res:*; switch (methodName.toString()) { case 'clear': _item = new Array(); break; case 'sum': var sum:Number = 0; for each (var i:* in _item) { // ignore non-numeric values if (!isNaN(i)) { sum += i; } } res = sum; break; case 'push': res = "push function" break default: res = _item[methodName].apply(_item, args); break; } return res; } override flash_proxy function getProperty(name:*):* { if (name == "push") return "push property" return _item[name]; } override flash_proxy function setProperty(name:*, value:*):void { _item[name] = value; } } |
|
|||||
стервочка (я мужик)
|
wvxvw, мдя .. ты точно понял, что я тебе написал? у тебя уже есть свойство addEventListener. имеет оно тип Function. ты хочешь, что бы у тебя появилось ещё одно такое же свойство? и что бы он и оба были public? юзай нэймспэйс, только используй его не для IEventDispatcher, а для своих прокси-свойств. можно обращаться ещё не как к свойству, а как к атрибуту, но это уже другая песня.
|
|
|||||
Modus ponens
|
dynamic class ProxyArray extends Proxy не имплементит ничего... про вариант с callProperty я написал еще в первом сообщении... а вот если в вашем примере ProxyArray будет еще и implements IProxyArray, у которого есть функция push(...rest):int то тогда callProperty не вызовется и нужно будет этот метод явно задать в классе а не через callProperty...
Блуд, ты не совсем правильно прочитал вопрос: мне нужна fallback функция, которая бы сработала если метод не вызывают, а пытаются переопределить / получить доступ к свойствам метода... Т.е. самый простой пример:
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 26.03.2009 в 18:39. |
|
|||||
стервочка (я мужик)
|
я всё правильно понял. а ты как я написал выше, либо не понимаешь то, что я пишу, либо не хочешь понять. как и предыдущих постах на подобную тему, я тебе повторю: ты не сможешь повторить функционал XML на обычных классах.
|
|
|||||
Регистрация: Mar 2008
Сообщений: 215
|
Действительно, в случае когда функция(она же свойство) явно реализована в классе, то при обращении к ней не происходит вызовова ни одного специфичного для proxy метода(callProperty, getProperty и т.д.).
Видимо, сделать как вы хотите нельзя. |
Часовой пояс GMT +4, время: 11:17. |
|
« Предыдущая тема | Следующая тема » |
|
|