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

Регистрация: Sep 2002
Сообщений: 30,787
Delegate используется в силу того, что многие объекты во Flash 8 (и ниже) не являются вещателями, т.е. невозможно подписаться на события объекта.
Есть некий класс, который занимается обработкой данных, полученных из XML. Обработка — задача именно этого класса, а не объекта XML (как раз то, о чём пишет miramax). Поэтому, т.к. подписаться на onLoad нельзя, используется перенаправление вызова данного метода в метод нашего класса, т.е. как бы подписка на события.

У меня есть класс AbstractXML, который является вещателем, вот как он выглядит:
Код:
import mx.events.EventDispatcher;
/**
 * @author Denis Kolyako
 */
class ru.etcs.data.AbstractXML extends XML {
	
	private var __xml_url:String;
	
	public var event:String = 'onXMLLoad';
	public var errorEvent:String = 'onXMLLoadError';
	public var idMap:Object;

	private var dispatchEvent:Function;
	public var addEventListener:Function;
	public var removeEventListener:Function;
			
	public function AbstractXML(xml_url:String) {
		super("");
		this.ignoreWhite = true;
		EventDispatcher.initialize(this);
		this.__xml_url = xml_url;
		this.load(this.__xml_url);
	}
		
	private function onLoad(ok:Boolean):Void {
		if (!ok || !this.loaded || this.status || this.getBytesTotal()<30) {
			trace('XML loaded: '+this.loaded+', valid: '+this.status);
			this.dispatchEvent({type:this.errorEvent});
			return;
		}	
		this.prepareData();
		this.dispatchEvent({type:this.event});
	}
	
	private function prepareData():Void {
		// For override	
	}

}
И у меня нет необходимости перенаправлять вызовы, я просто подписываюсь на события (имена которых, для удобства, можно изменить).