Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.03.2009, 16:45
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 1  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
По умолчанию Прокси класс не может реализовать интерфейс?

Ситуация такая:
есть класс наследующийся от прокси, у него есть метод foo(), и существует вероятность, что у него же будет свойство foo. Теперь, если мы попробуем сделать так: proxyInstance["foo"], то getProperty не сработает... вместо этого нам вернется ссылка на метод foo()... Это можно избежать переделав все методы в приватные и в callProperty вызывать приваные методы вместо пабликов... но в таком случае класс не будет реализовывать нужный интерфейс... методы помещенные в другой неймспейс не считаются имплементаторами...
Может у кого-то есть идеи по поводу как побороть?
__________________
Hell is the possibility of sanity

Старый 26.03.2009, 17:23
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 2  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
А если просто кастануть объект к интерфейсу, в котором объявлено свойство, и потом явно обратиться castedProxyInstance.foo, - проблема не решится?

Старый 26.03.2009, 17:26
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от wvxvw Посмотреть сообщение
есть метод foo(), и существует вероятность, что у него же будет свойство foo.
Это косяк архитектуры называется.

incoob, каст вернет null в таком случае.

Старый 26.03.2009, 17:52
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 4  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
а причём тут прокси и имплемантация вообще? просто метод foo тоже является свойством типа Function.

код ниже возвращает ошибку
Код:
1021: Duplicate function definition.
Код AS3:
class A {
 
	public function A() {
		super();
	}
 
	public function get foo():Object {
		return null;
	}
 
	public function foo():Object {
		return null;
	}
 
}

Старый 26.03.2009, 17:52
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну да... а как ты например реализуешь IEventDispatcher и так, чтобы у прокси могло быть свойство addEventListener например =/ И уже если это и дефект архитектуры - то не мой... я же не пытался вызвать метод... это как бы совсем не "предсказуемое" поведение... я бы ожидал, что методы не числились бы в качестве свойств...

Не, Блуд, речь не об этом... речь о том, я ожидал другое поведение... т.е. сначала попытаться найти свойство, а если свойства нет, то тогда уже смотреть в методах...
Да и собственно, не суть важно в чем конкретно ошибка... ну вот нужно мне, чтобы был proxy IEventDispatcher со свойством addEventListener, а не методом...
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 26.03.2009 в 18:00.
Старый 26.03.2009, 18:26
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 6  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
Цитата:
Сообщение от __etc Посмотреть сообщение
каст вернет null в таком случае.
Я не знал о существовании flash.utils.Proxy и подумал на паттерн Proxy. Удивился конечно, что во флеше как-то можно делать функции с одним и тем же именем, ну да ладно, чего на свете не бывает... Подумал я так из-за
Цитата:
Сообщение от wvxvw Посмотреть сообщение
есть класс наследующийся от прокси, у него есть метод foo(), и существует вероятность, что у него же будет свойство foo
Собственно говоря, ваша ошибка была в том, что вы пытались посмотреть, что есть foo - функция или свойство(этож вроде тоже функция? но не суть дело...).
Я немного модифицировал стандартный пример и вот что получилось:
Код AS3:
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;
    }
}
Так что во флеше можно и такое шаманство реализовать Хотя лично я бы так никогда не поступил...

Старый 26.03.2009, 18:32
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 7  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
wvxvw, мдя .. ты точно понял, что я тебе написал? у тебя уже есть свойство addEventListener. имеет оно тип Function. ты хочешь, что бы у тебя появилось ещё одно такое же свойство? и что бы он и оба были public? юзай нэймспэйс, только используй его не для IEventDispatcher, а для своих прокси-свойств. можно обращаться ещё не как к свойству, а как к атрибуту, но это уже другая песня.

Старый 26.03.2009, 18:34
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
dynamic class ProxyArray extends Proxy не имплементит ничего... про вариант с callProperty я написал еще в первом сообщении... а вот если в вашем примере ProxyArray будет еще и implements IProxyArray, у которого есть функция push(...rest):int то тогда callProperty не вызовется и нужно будет этот метод явно задать в классе а не через callProperty...

Блуд, ты не совсем правильно прочитал вопрос: мне нужна fallback функция, которая бы сработала если метод не вызывают, а пытаются переопределить / получить доступ к свойствам метода...
Т.е. самый простой пример:
Код AS3:
var xml:XML = <name/>;
trace(xml.name); // Вот тут мне абсолютно не нужно обращаться к методу name()!
trace(xml.name());
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 26.03.2009 в 18:39.
Старый 26.03.2009, 19:00
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 9  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
я всё правильно понял. а ты как я написал выше, либо не понимаешь то, что я пишу, либо не хочешь понять. как и предыдущих постах на подобную тему, я тебе повторю: ты не сможешь повторить функционал XML на обычных классах.

Старый 26.03.2009, 19:36
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 10  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
Действительно, в случае когда функция(она же свойство) явно реализована в классе, то при обращении к ней не происходит вызовова ни одного специфичного для proxy метода(callProperty, getProperty и т.д.).
Видимо, сделать как вы хотите нельзя.

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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