Показать сообщение отдельно
Старый 23.10.2007, 12:58
LokiDi L0ck вне форума Посмотреть профиль Отправить личное сообщение для LokiDi L0ck Найти все сообщения от LokiDi L0ck
  № 6  
Ответить с цитированием
LokiDi L0ck

Регистрация: Oct 2007
Сообщений: 53
Если listener сделать публичным.
Main.as3:
Код:
package {
	import flash.display.Sprite;
	import foo.Foo;
	import bar.Bar;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite
	{
		public function Main()
		{
			var f:Foo = new Foo();
			var b:Bar = new Bar();
			
			f.addEventListener(MouseEvent.CLICK, b.mouseClickListener);
			
			addChild(f);
			addChild(b);			
		}
	}
}
Foo.as3:
Код:
package foo
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class Foo extends Sprite
	{
		public function Foo()
		{
			x = 50;
			y = 50;
			
			graphics.beginFill(0x009900);
			graphics.drawCircle(0, 0, 10);
			
			var text:TextField = new TextField();
			text.text = "Foo";
			text.x = 10;
			text.y = 10;
			
			addChild(text);
			
		}
	}
}
Bar.as3:
Код:
package bar
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	
	public class Bar extends Sprite
	{
		public function Bar()
		{
			x = 100;
			y = 100;
			
			graphics.beginFill(0x990000);
			graphics.drawCircle(0, 0, 10);
			
			var text:TextField = new TextField();
			text.text = "Bar";
			text.x = 10;
			text.y = 10;
			
			addChild(text);
		}
		
		public function mouseClickListener(e:MouseEvent):void
		{
			trace("Вызван Bar.mouseClickListener()");
		}
	}
}
Если listener сделать приватным, код чуть-чуть поменяется:
В Main.as3:
Код:
package {
	import flash.display.Sprite;
	import foo.Foo;
	import bar.Bar;
	import flash.events.MouseEvent;
	
	public class Main extends Sprite
	{
		protected var bClickListener:Function;
		
		public function Main()
		{
			var f:Foo = new Foo();
			var b:Bar = new Bar();
			
			bClickListener = function(e:MouseEvent):void {
				trace("MAIN: Foo CLICKED");
				b.getClickListener(e)();
			};
			
			f.addEventListener(MouseEvent.CLICK, bClickListener);
			
			addChild(f);
			addChild(b);			
		}
	}
}
В Bar.as3 - mouseClickListener делается приватным, и добавляется public метод.

Код:
public function getClickListener(e:MouseEvent):Function
{
	return function():void {
		mouseClickListener(e);
	};
}
Всё можно сделать красивее, расширив например класс Function через prototype, добавив в него функцию типа Delegate.
Код только для примера, набросал не для реального применения.
__________________
Новичок


Последний раз редактировалось LokiDi L0ck; 23.10.2007 в 13:06.