11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 1821|回复: 1
上一主题 下一主题

[事件机制] 事件练习之七(给复合的发送事件类添加一个属性指向父级的属性)

[复制链接] TA的其它主题
发表于 2019-1-19 15:46:21 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本练习是对练习五的修改;
[Actionscript3] 纯文本查看 复制代码
//文档类;
package  {
	//注意:我这里没有导入EventDispatcher类,而是导入自定义的类;
	import flash.display.Sprite;
	import flash.events.Event;
	import son.ComDispatch;
	
	public class doc extends Sprite {
		//创建一个自定义类的实例属性;
		var sender:ComDispatch=new ComDispatch("赵老师");
		public function doc() {
			//每次调用EventDispatcher类的相关方法之前都要先调用getSend方法,这就是复合的特点;
			sender.Receiv(eFun);
			sender.getSend().addEventListener("下课",eFun);
			//但是doSome方法中有发送事件的方法;
			sender.doSome();
			sender.Romve(eFun);
			sender.getSend().dispatchEvent(new Event("下课"));
			sender.getSend().removeEventListener("下课",eFun);
		}
		//下面的方法将根据不同类型的事件作出不同的回应;
		private function eFun(e:Event):void{
			if(e.type=="上课"){
				//在这里可以用target.nam的方法访问目标的namn属性;
				trace(e.target.nam+"好!!");
				}
				else if(e.type=="下课"){
					trace("老师再见!");
					}
			}
	}
	
}

//用复合的方法定义一个发送事件类;
package son {
	import flash.events.Event;
	import flash.events.EventDispatcher;
	public class ComDispatch {
        //复合一个私有的EventDispatcher属性;
		private var _eDispatcher:InterDis=new InterDis();
		public var nam:String;
		public function ComDispatch(str:String) {
			//把参数传给nam属性,并让复合类中的nam属性指向这个nam;
			nam=str;
			_eDispatcher.nam=this.nam;// constructor code
		}
		//定义一个方法,用来访问私有的属性,从而调用这个属性的相关方法;
		public function getSend():InterDis{
			//在访问属性之前,先输出发送者的名字;
			trace("我是发送者:"+nam);
			return _eDispatcher;
			}
		public function doSome(){
			//下面是一个动作,并发送了“上课”事件;
			trace("我在用一个方法,并发送上课事件");
			_eDispatcher.dispatchEvent(new Event("上课"));
			}
			//用上下面的方法侦听事件;
		public function Receiv(ef:Function){
			//下面是一个动作,并接收“上课”事件;
			trace("我在用一个方法,并接收上课事件");
			_eDispatcher.addEventListener("上课",ef)
			}
		public function Romve(ef:Function){
			trace("我在用一个方法,并移除侦听器");
			_eDispatcher.removeEventListener("上课",ef);

			}


	}
	
}

//用接口的方式来创建发送事件类;
package  son{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
//定义一个InterDis类,实现IEventDispatcher接口;
public class InterDis implements IEventDispatcher{
//首先定义一个公开的属性_sender,类型为:EventDispatcher,相当于复合EventDispatcher!
public var  _sender:EventDispatcher;
//定义一个nam属性;
public var nam:String;
//在构造函数中为nam属性赋值;
public function InterDis():void{
//注意参数是"this";
_sender=new EventDispatcher(this);
}
//接下来是实现IEventDispatcher的几个公开的方法;
//第一个是addEventListener方法;
//五个参数中最常用的是前两个,后三个保持默认;
public function addEventListener(type:String,fun:Function,useC:Boolean=false,pro:int=0,useW:Boolean=true):void{
//这里可以加入其他的代码;
trace("我在侦听时加入了代码!")
//用属性_sender的addEventListener方法来实现(其他的方法类似);
_sender.addEventListener(type,fun,useC,pro,useW);
}
//第二个是dispatchEvent方法;
//注意:它有返回值,类型是:Boolean;
public function dispatchEvent(evt:Event):Boolean{
return _sender.dispatchEvent(evt);
}
//第三个是removeEventListener方法;
public function removeEventListener(type:String,fun:Function,useC:Boolean=false):void{
_sender.removeEventListener(type,fun,useC);
}
//剩下的两个方法不太常用,但也要实现;
public function hasEventListener(type:String):Boolean{
return _sender.hasEventListener(type);
}
public function willTrigger(type:String):Boolean{
return _sender.willTrigger(type);
}
}
}



 楼主| 发表于 2019-1-19 15:49:26 | 显示全部楼层
本帖最后由 雪原xy 于 2019-1-19 16:01 编辑

学习心得:
本次小练习是在TKCB的指导下,对练习五的修改;
用实现接口的方法在复合类中添加了一个nam属性,
并让目标类中的nam指向复合类中的nam;
达到了使用target属性来访问目标实例的效果。
学习中的困惑:
不知道我的这个方法是不是TKCB所说的perent属性??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表