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

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

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

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
По умолчанию MXML без Flex и коллекции

Доброго времени суток.
Подскажите, если кто знает.
Если в классе есть свойство типа Array или Vector, например с именем test, то потом можно на mxml формировать коллекцию:

Код:
		<root:test>
			<root:Object />
			<root:Object />
		</root:test>
Ну и в таком духе...
Вопрос в том, а можно ли сделать собственную, пользовательскую коллекцию, не являющуюся наследником Array или Vector, что бы mxml мог с ней работать в таком же ключе? И если да, то какие требования к это коллекции? Ну там типа наличие каких то функций, наследования от каких то интерфейсов, какие то метатеги?

Добавлено через 4 минуты
Мдя, перечитывая свой вопрос, подумал, что дело наверное в конструкторе...
Т.е. вчера я выяснил, что такой код:
Код:
		<fx:Declarations>
			<s:int id="k">1</s:int>
		</fx:Declarations>
Можно предположить, что в результате будет что-то условно типа:
Код AS3:
var k:int=new int(1);
Тогда вероятно тоже и тут...
Код AS3:
test=new TestType(new Array(....));
где 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 - это именно коллекция и научить его с ней работать?
__________________
Искренне Ваш, Джек.

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Нет, нельзя, только если генератор MXML менять. Там просто намертво забито, что это может быть либо вектор, либо массив. По-дефолту - массив. Если это будет своя коллекция, то генератор не будет знать как сгенерить код добавления элементов... вобщем, теоретически, если есть желание заморочится - нужно смотреть исходники компилятора, это конкретное место и патчить.
__________________
Hell is the possibility of sanity

Старый 18.10.2011, 20:26
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 3  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
печально... лесть в компилятор по моему не правильно, это хаки которые при любой смене framework могут перестать работать, да и не настолько это критично... Просто не красиво получается...
А такой тогда вопрос, к примеру я наследуюсь от Array, имплементирую IEventDispatcher, перегружаю там все методы связанные с модификацией массива, что бы он диспатчил соответствующие события о добавлении и удалении элемента, тут все просто, но есть 1 жесткая дырка! Остается возможность написать
Код AS3:
arr[1]=object;
Это как то можно перехватить?
Тогда можно было бы написать более ли менее приемлемый вариант для данного случае.
Т.е. коллекция наша, наследник Array.
тогда getter возвращает нашу коллекцию и мы полностью контролируем любые действия над ней.
ну а с сеттером все просто, мы перебираем все элементы переданного нам массива и добавляем в нашу коллекцию... Получается относительно нормальная архитектура...
__________________
Искренне Ваш, Джек.

Старый 18.10.2011, 20:51
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Что мешает полученный массив использовать как source для своей коллекции?

Добавлено через 2 минуты
Для test можно определить свойство по-умолчанию [DefaultProperty] в которое будут складываться добавляемые элементы.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 18.10.2011, 20:59
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 5  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Так собственно я и написал об это в последнем посте... Просто меня смущает избыточность, т.е. к примеру если у нас есть:

Код AS1/AS2:
interface IEntity
{
    function get childs():Array;
    function set childs(arr:Array):void;
}
То соответственно функция вроде addChild кажется избыточной, ввиду того, что логично было бы тогда делать так:
Код AS3:
instance.childs.push(new Object());
Соответственно сеттер действительно является просто source для мой коллекци, а геттер обеспечивает весь остальной функционал. Но так как надо контролировать добавление/удаление элементов, геттер возвращает полиморфный класс, не Array, а его наследник. Так у меня сейчас сделано.
Но здесь есть одна дырка. Я никак не могу в наследники отследить ситуацию:
Код AS3:
instance.childs[1]=new Object();
На данный момент я вижу только 3 способа заткнуть эту дырку:
1) Реализовать весь набор вроде add,remove, и гетером просто возвращать клон коллекции, так сказать "для чтения"...
2) Реализовать весь набор вроде add,remove, у брать геттер
3) Понадеяться на то, что никто не станет пользоваться этой дыркой и оставить как есть Последний вариант подкупает своей простотой, но немного смущает
__________________
Искренне Ваш, Джек.

Старый 18.10.2011, 21:27
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Код AS3:
package mx.styles
{
[DefaultProperty("source")]
public class MyCollection
{
    public function set source(value:Array):void {...}
    public function get source():Array {...}
...
    //методы работы с коллекцией
{
{
Код:
<root:test>
		<MyCollection>
			<root:Object />
			<root:Object />
		<MyCollection/>
	</root:test>
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 18.10.2011, 21:28
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 7  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
О, изящно! Спасибо!

Добавлено через 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>
Код AS3:
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;
	}
 
}
Код AS3:
[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;
	}
 
 
}
Добавлено через 2 часа 53 минуты
получилось сделать так, но это уже совсем не изящно, скорее наоборот
Код:
		<root:components>
			<root:ComponentCollection>
				<root:Component />
			</root:ComponentCollection>
		</root:components>
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 19.10.2011 в 00:02.
Старый 19.10.2011, 00:56
Flashrunner вне форума Посмотреть профиль Отправить личное сообщение для Flashrunner Найти все сообщения от Flashrunner
  № 8  
Ответить с цитированием
Flashrunner

Регистрация: Sep 2010
Сообщений: 47
Цитата:
Сообщение от JackFromChaos Посмотреть сообщение
Выдает ошибку 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
Что я не так сделал?
Передали Component туда, где ожидался ComponentCollection, о чем и говорит текст ошибки.
Цитата:
Сообщение от JackFromChaos Посмотреть сообщение
получилось сделать так, но это уже совсем не изящно, скорее наоборот
Код:
		<root:components>
			<root:ComponentCollection>
				<root:Component />
			</root:ComponentCollection>
		</root:components>
А вот так правильно.
Что именно вас не устраивает?

Старый 19.10.2011, 01:54
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 9  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
Лишняя пара тэгов(как следствие увеличение глубины и усложнение читабельности), избыточность описание(зачем писать тип того, что не должно иметь другого типа? +необходимость об этом помнить).
Лучше уж тогда сделать тупо flash style(к примеру как filters), на чем и остановился пока, ввиду простоты реализации:
Код AS3:
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);
                ...
	}
        ...
}
С типом Array mxml работает без лишних тэгов и ладно...
Функционал работы с коллекцией перекочевывает непосредственно в владельца(как дети в DisplayObjectContainer), для работы mxml добавлен функционал аналогичный функционалу filters у DisplayObject. Не особо изящно, но работает...
__________________
Искренне Ваш, Джек.

Старый 19.10.2011, 03:03
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
избыточность описание(зачем писать тип того, что не должно иметь другого типа?
Это не тип. Это экземпляр, точнее будет инстанцирован экземпляр.
__________________
משיח לא בא
משיח גם לא מטלפן

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

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

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


 


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


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