Тема: toString Vector
Показать сообщение отдельно
Старый 08.04.2013, 15:23
Александр Мостовой вне форума Посмотреть профиль Отправить личное сообщение для Александр Мостовой Посетить домашнюю страницу Александр Мостовой Найти все сообщения от Александр Мостовой
  № 5  
Ответить с цитированием
Александр Мостовой
 
Аватар для Александр Мостовой

Регистрация: Sep 2001
Адрес: Харьков
Сообщений: 305
Отправить сообщение для Александр Мостовой с помощью ICQ Отправить сообщение для Александр Мостовой с помощью Skype™
Можно сделать через Proxy наследника, но интересно бы узнать зачем?
Единственным полезным примененим таких переопределений я бы посчитал развер рассылку событий об обновлении данных, а для toString, почему неудобно просто использовать статическую утилиту MyUtils.vectorToString(value:Vector.<*>); ?

Вот например наследник от Vector.<Point>. Сохраняяет все мотоды Vector, но переопределяет toString;
МОжно подумать еще над передачей типа.

Код AS3:
package {
	import flash.display.Sprite;
	import flash.geom.Point;
 
	public class ProxyExample extends Sprite 
	{
		public function ProxyExample() 
		{
			var vector:ProxyVector = new ProxyVector();
			vector.push(new Point(Math.random(), Math.random()));
			vector.push(new Point(Math.random(), Math.random()));
			vector.push(new Point(Math.random(), Math.random()));
			vector.push(new Point(Math.random(), Math.random()));
			vector.push(new Point(Math.random(), Math.random()));
 
			trace(vector.length);//Методы Vector сохранились
			trace(vector.toString());
			/*Выводит :
			item [0] = (x=0.5526889930479228, y=0.4928265390917659)
			item [1] = (x=0.007704821415245533, y=0.5104764206334949)
			item [2] = (x=0.5938579649664462, y=0.913416794501245)
			item [3] = (x=0.19566342374309897, y=0.6506094681099057)
			item [4] = (x=0.4772168640047312, y=0.5084680668078363) */
 
 
		}
	}
}
import flash.geom.Point;
import flash.utils.Proxy;
import flash.utils.flash_proxy;
 
dynamic class ProxyVector extends Proxy {
	private var _item:Vector.<Point>;
 
	public function ProxyVector() {
		_item = new Vector.<Point>();
	}
 
	override flash_proxy function callProperty(methodName:*, ... args):* {
		var res:*;
		if (methodName.toString() == 'toString')
		{
			var output:String = "";
			var len:uint = _item.length;
			for (var i:uint = 0; i < len; i++)
			{
				output += 'item [' + String(i) + '] = ' + _item[i].toString() + "\n";
			}
			res = output;
		}
		else
		{
			var _itemObj:Object = _item as Object;
			res = _itemObj[methodName].apply(_item, args);
		}
		return res;
	}
 
	override flash_proxy function getProperty(name:*):* {
		return _item[name];
	}
 
	override flash_proxy function setProperty(name:*, value:*):void {
		_item[name] = value;
	}
}


Мне кажется лучше просто завернуть его в обертку, и обращаться просто на точку длиннее vectorCont.item[i];


Прикольно как в разных языках по разному происходит эволюция, то от чего в AS с трудом избавились, в других языках воспринимают за достижение.
Или прикольно было набдюдать как СилверЛайтчики гордились тем что у них компонент на векторах, хотя без строкхинтинга с небрежно размазанными шрифтами, а во флеше очень радовлись когда появилась возможность работы с bitmapData вместо вектора
__________________
...


Последний раз редактировалось Александр Мостовой; 08.04.2013 в 15:37.