Показать сообщение отдельно
Старый 08.06.2009, 23:25
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 13  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
в простейшем виде то, что Дима описал:
Код AS3:
package 
{
	import fl.controls.CheckBox;
	import flash.display.Sprite;
	import flash.events.Event;
 
 
	public class Main extends Sprite 
	{
		private var _sw1:LogicSorce = new LogicSorce();
		private var _sw2:LogicSorce = new LogicSorce();
		private var _gate:LogicGate = new LogicGate(_sw1,_sw2);
		private var _consumer:LogicConsumer = new LogicConsumer(_gate);
 
		public function Main():void 
		{
			//чекбоксы-переключатели
			var cb1:CheckBox = new CheckBox();
			var cb2:CheckBox = new CheckBox();
			cb2.y = 30;
 
			cb1.addEventListener(Event.CHANGE, change1Handler);
			cb2.addEventListener(Event.CHANGE, change2Handler);
 
			addChild(cb1);
			addChild(cb2);
 
		}
		//переключаем источники, смотрим трейс на потребителе
		private function change1Handler(evnt:Event):void 
		{
			_sw1.switchState();
		}
 
		private function change2Handler(evnt:Event):void 
		{
			_sw2.switchState();
		}
 
	}
 
}
Код AS3:
package  
{
	import flash.events.*;
	//перключатель
	public class LogicSorce extends EventDispatcher
	{
 
		private var _output:Boolean = false;
 
		public function LogicSorce() 
		{
		}
 
		public function switchState():void
		{
			_output = !_output;
			dispatchEvent(new Event(Event.CHANGE));
		}
 
 
		public function get output():Boolean
		{
			return _output;
		}
 
	}
}
Код AS3:
package  
{
	import flash.events.*;
 
	//OR-блок
	public class LogicGate extends EventDispatcher
	{
		private var _output:Boolean = false;
		private var _input1:LogicSorce;
		private var _input2:LogicSorce;
 
		public function LogicGate(inp1:LogicSorce,inp2:LogicSorce) 
		{
			_input1 = inp1;
			_input2 = inp2;
			_input1.addEventListener(Event.CHANGE, changeHandler);
			_input2.addEventListener(Event.CHANGE, changeHandler);
		}
 
		private function changeHandler(evnt:Event):void 
		{
			dispatchEvent(new Event(Event.CHANGE));
		}
 
		public function get output():Boolean
		{
			return _input1.output || _input2.output;
		}
 
	}
}
Код AS3:
package  
{
	import flash.events.Event;
 
	//лампочка
	public class LogicConsumer 
	{
		private var _input:LogicGate;
		public function LogicConsumer(inp:LogicGate) 
		{
			_input = inp;
			_input.addEventListener(Event.CHANGE, changeHandler);
		}
 
		private function changeHandler(evnt:Event):void 
		{
			trace("лампочка: " + _input.output);
		}
 
	}
}
понятно, что все затейливее:добавление входов на сеттерах, какие-то интерфейсы чтобы универсально добавлять разные типы и т.д., но это уже как бы детали, я так тут намусорил изрядно