![]() |
|
||||||||||
|
|
|
|||||
|
Доброго времени суток.
Подскажите, если кто знает. Если в классе есть свойство типа Array или Vector, например с именем test, то потом можно на mxml формировать коллекцию: Ну и в таком духе... Вопрос в том, а можно ли сделать собственную, пользовательскую коллекцию, не являющуюся наследником Array или Vector, что бы mxml мог с ней работать в таком же ключе? И если да, то какие требования к это коллекции? Ну там типа наличие каких то функций, наследования от каких то интерфейсов, какие то метатеги? Добавлено через 4 минуты Мдя, перечитывая свой вопрос, подумал, что дело наверное в конструкторе... Т.е. вчера я выяснил, что такой код: Можно предположить, что в результате будет что-то условно типа: Тогда вероятно тоже и тут... где TestType - тип свойства Test... Надо проверить %) Добавлено через 18 минут Проверил. Не вышло, вопрос остается открытым! На самом деле, даже наследник Array не подходит,в смысле тип свойства test в данном случае должно быть Array, иначе появляется ошибки: Error: In initializer for 'test', multiple initializer values for target type componets.TestCollection. <root:Component /> - если пытаться сделать несколько объектов и Error: In initializer for 'test', type componets.Component is not assignable to target type 'componets.TestCollection'. <root:Component /> - если только один... И все таки, можно ли как то сообщить mxml что TestCollection - это именно коллекция и научить его с ней работать?
__________________
Искренне Ваш, Джек. |
|
|||||
|
Modus ponens
|
Нет, нельзя, только если генератор MXML менять. Там просто намертво забито, что это может быть либо вектор, либо массив. По-дефолту - массив. Если это будет своя коллекция, то генератор не будет знать как сгенерить код добавления элементов... вобщем, теоретически, если есть желание заморочится - нужно смотреть исходники компилятора, это конкретное место и патчить.
__________________
Hell is the possibility of sanity |
|
|||||
|
печально... лесть в компилятор по моему не правильно, это хаки которые при любой смене framework могут перестать работать, да и не настолько это критично... Просто не красиво получается...
А такой тогда вопрос, к примеру я наследуюсь от Array, имплементирую IEventDispatcher, перегружаю там все методы связанные с модификацией массива, что бы он диспатчил соответствующие события о добавлении и удалении элемента, тут все просто, но есть 1 жесткая дырка! Остается возможность написать Это как то можно перехватить? Тогда можно было бы написать более ли менее приемлемый вариант для данного случае. Т.е. коллекция наша, наследник Array. тогда getter возвращает нашу коллекцию и мы полностью контролируем любые действия над ней. ну а с сеттером все просто, мы перебираем все элементы переданного нам массива и добавляем в нашу коллекцию... Получается относительно нормальная архитектура...
__________________
Искренне Ваш, Джек. |
|
|||||
|
Что мешает полученный массив использовать как source для своей коллекции?
Добавлено через 2 минуты Для test можно определить свойство по-умолчанию [DefaultProperty] в которое будут складываться добавляемые элементы.
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Так собственно я и написал об это в последнем посте... Просто меня смущает избыточность, т.е. к примеру если у нас есть:
interface IEntity { function get childs():Array; function set childs(arr:Array):void; } Соответственно сеттер действительно является просто source для мой коллекци, а геттер обеспечивает весь остальной функционал. Но так как надо контролировать добавление/удаление элементов, геттер возвращает полиморфный класс, не Array, а его наследник. Так у меня сейчас сделано. Но здесь есть одна дырка. Я никак не могу в наследники отследить ситуацию: На данный момент я вижу только 3 способа заткнуть эту дырку: 1) Реализовать весь набор вроде add,remove, и гетером просто возвращать клон коллекции, так сказать "для чтения"... 2) Реализовать весь набор вроде add,remove, у брать геттер 3) Понадеяться на то, что никто не станет пользоваться этой дыркой и оставить как есть Последний вариант подкупает своей простотой, но немного смущает![]()
__________________
Искренне Ваш, Джек. |
|
|||||
package mx.styles { [DefaultProperty("source")] public class MyCollection { public function set source(value:Array):void {...} public function get source():Array {...} ... //методы работы с коллекцией { {
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
О, изящно! Спасибо!
Добавлено через 2 часа 28 минут Что-то не получается Выдает ошибку Error: In initializer for 'components', type dio.componentModel.core.Component is not assignable to target type 'dio.componentModel.core.ComponentCollection'. <root:Component /> Build halted with errors Что я не так сделал? <?xml version="1.0" encoding="utf-8"?> <root:Entity xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:root="dio.componentModel.core.*" xmlns:s="*"> <root:components> <root:Component /> </root:components> </root:Entity> public class Entity { protected var _components:ComponentCollection; public function Entity() { } public function get components():ComponentCollection { return _components; } public function set components(value:ComponentCollection ):void { _components=value; } } [DefaultProperty("source")] public class ComponentCollection { protected var _arr:Array = new Array(); public function ComponentCollection() { } public function get source():Array { return _arr; } public function set source(value:Array):void { _arr = value; } } получилось сделать так, но это уже совсем не изящно, скорее наоборот ![]()
__________________
Искренне Ваш, Джек. Последний раз редактировалось JackFromChaos; 19.10.2011 в 00:02. |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 47
|
Цитата:
Цитата:
Что именно вас не устраивает? |
|
|||||
|
Лишняя пара тэгов(как следствие увеличение глубины и усложнение читабельности), избыточность описание(зачем писать тип того, что не должно иметь другого типа? +необходимость об этом помнить).
Лучше уж тогда сделать тупо flash style(к примеру как filters), на чем и остановился пока, ввиду простоты реализации: public class Entity { protected var _components:Array = new Array(); public function Entity() { } public function get components():Array { return clone(_components); } public function set components(value:Array):void { removeAllComponents(); var c:int = value.length; for (var i:int = 0; i < c; i++) addComponent(value[i]); } public function addComponent(component:IComponent,name:String=null):void { _components.push(component); ... } ... } Функционал работы с коллекцией перекочевывает непосредственно в владельца(как дети в DisplayObjectContainer), для работы mxml добавлен функционал аналогичный функционалу filters у DisplayObject. Не особо изящно, но работает...
__________________
Искренне Ваш, Джек. |
|
|||||
|
Цитата:
__________________
משיח לא בא משיח גם לא מטלפן |
![]() |
![]() |
Часовой пояс GMT +4, время: 15:52. |
|
|
« Предыдущая тема | Следующая тема » |
|
|