Вход

Просмотр полной версии : Особенности наследования от класса Proxy


PainKiller
08.05.2013, 15:48
Тема навеяна чтением Adobe AIR Bible, в главе 15 (стр. 285) приводится пример класса Config, который является синглтоном, и свойства которого (названия и значения) берутся из XML-файла. Config наследуется от класса flash.utils.Proxy, и в нем переопределяется метод getProperty таким образом:

override flash_proxy function getProperty(name:*):*
{
//делает всю магию: создает свойство и придает ему значение из xml
return xml.property.(@name == String(name)).@value;
}

Я скопипастил код из книги и он у меня не сработал, создаваемые таким образом свойства выдают ошибку при обращении к ним. Немного подумав, я понял что прокси тут вообще не нужен, и написал свою реализацию этого класса, просто сделав его динамическим. Но остался вопрос к более опытным товарищам - почему не сработал вариант с прокси? Прилагаю проект сделанный в FD, в котором 2 конфигкласса (ConfigProxy - вариант из книги, не работает, ConfigDynamic - мой вариант с динамическим классом, работает). Ну и в догонку еще одни вопрос, возможно заслуживающий отдельной темы, если кто то знает еще способы сборки классов из XML, и варианты полезного применения этого, будет здорово если вы ими поделитесь. Заранее спасибо1

dimarik
08.05.2013, 16:02
Что-то вы не все методы flash_proxy переопределили
Error: Error #2091: Класс Proxy не поддерживает hasProperty. Он должен быть заменен на подкласс.
at Error$/throwError()
at flash.utils::Proxy/http://www.adobe.com/2006/actionscript/flash/proxy::hasProperty()
at Main/onConfigProxyInit()[C:\Users\ODevyatko\Desktop\MyProjects\Config\ConfigTest\src\Main.as:35]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at ConfigProxy/dispatchEvent()[C:\Users\ODevyatko\Desktop\MyProjects\Config\ConfigTest\src\ConfigProxy.as:90]
at ConfigProxy/parseXML()[C:\Users\ODevyatko\Desktop\MyProjects\Config\ConfigTest\src\ConfigProxy.as:135]
at ConfigProxy/onXMLLoadSuccess()[C:\Users\ODevyatko\Desktop\MyProjects\Config\ConfigTest\src\ConfigProxy.as:116]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

PainKiller
08.05.2013, 16:42
Эта ошибка выкидывается, если раскомментировать эту строчку (т.е. проверить есть ли такое свойство):

trace("exampleProperty1" in ConfigProxy.getInstance());

если же просто обратиться к свойствам

trace("exampleProperty1 -> " + ConfigProxy.getInstance().exampleProperty1);

выкидывается такая ошибка:

C:\Users\...\Desktop\MyProjects\Config\ConfigTest\src\Main.as(37): col: 61 Error: Access of possibly undefined property exampleProperty1 through a reference with static type ConfigProxy.
trace("exampleProperty1 -> " + ConfigProxy.getInstance().exampleProperty1);

А вообще я подчищенную версию проекта выложил, с переопределением методов Proxy я поигрался вдовль, но заставить заработать этот класс мне так и не удалось

dimarik
08.05.2013, 17:08
override flash_proxy function getProperty(value:*):*
{
//делает всю магию: создает свойство и придает ему значение из xml
return xml.property.(@name == String(value)).@value;
}

Добавлено через 5 минут
И еще
public dynamic class ConfigProxy extends Proxy ...

PainKiller
08.05.2013, 17:31
Прикольно, спасибо работает. Но если и там и там dynamic наследоваться от Proxy вообще не имеет смысла.