C代理和事件PPT课件_第1页
C代理和事件PPT课件_第2页
C代理和事件PPT课件_第3页
C代理和事件PPT课件_第4页
C代理和事件PPT课件_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第12章章代理和事件第1页/共26页2介绍代理在在C#C#中代理允许你动态的改变类中方法的引用。中代理允许你动态的改变类中方法的引用。DelegateDelegate(代理)是引用类型的变量,它包含到一(代理)是引用类型的变量,它包含到一个方法的引用。个方法的引用。代理是在运行时间接调用方法的一种通用目的机制,代理是在运行时间接调用方法的一种通用目的机制,它们在它们在C#C#程序中的基本用途是实现事件和回调的方程序中的基本用途是实现事件和回调的方法。法。为了在你的程序中实现代理,你需要声明代理、为了在你的程序中实现代理,你需要声明代理、实例化代理和使用代理。实例化代理和使用代理。第2页/共2

2、6页3委托Multiply(int,int).Divide(int,int).在运行时确定调用哪种方法委托和方法必须具有相同的签名-public delegate Call(int num1, int num2);-第3页/共26页4应用代理三步骤声明声明实例化实例化调用调用第4页/共26页5声明代理访问修饰符 delegate 返回类型 委托名(); 语法第5页/共26页6实例化代理指定需要的方法的地址给代理对象。指定需要的方法的地址给代理对象。这可以通过调用这可以通过调用delegatedelegate类的构造函数并且传递方法名来完成。类的构造函数并且传递方法名来完成。第6页/共26页7实

3、例化代理(续)下面的例子显示了如何指定方法的地址给一个代理变量:下面的例子显示了如何指定方法的地址给一个代理变量:第7页/共26页8定义委托class Delegates public delegate int Call(int num1, int num2); class Math public int Multiply(int num1, int num2) / 实现实现 public int Divide(int num1, int num2) / 实现实现 class TestDelegates static void Main() Call objCall; Math objMath

4、 = new Math(); objCall = new Call(math.Multiply); 将方法与委托关联起来第8页/共26页9定义委托class Delegates/ 委托定义public delegate int Call(int num1, int num2);class Math/ 乘法方法public int Multiply(int num1, int num2)return num1*num2;/ 除法方法public int Divide(int num1, int num2)return num1/num2;static void Main(string args)

5、/ 委托的对象Call objCall;/ Math 类的对象Math objMath = new Math();/ 将方法与委托关联起来objCall = new Call(objMath.Multiply);/ 将委托实例化result = objCall(5, 3);System.Console.WriteLine(结果为 0, result); 将方法与委托关联起来第9页/共26页10使用代理class PrintToDevice static FileStream FStream; static StreamWriter SWriter; public delegate void P

6、rintData(String s); public static void WriteConsole(string str) Console.WriteLine(0 Console,str); public static void WriteFile(string s) FStream = new FileStream(c:StoreData.txt,FileMode.Append,FileAccess.Write); SWriter = new StreamWriter(FStream); s = s + File; SWriter.WriteLine(s); SWriter.Flush(

7、); SWriter.Close(); FStream.Close(); public static void DisplayData(PrintData PMethod) PMethod(This should go to the); public static void Main() PrintData Cn = new PrintData(WriteConsole); PrintData Fl = new PrintData(WriteFile); DisplayData(Cn); DisplayData(Fl); Console.Read(); 第10页/共26页11代理的类型 单播代

8、理 多播代理第11页/共26页12class PrintToDevice static FileStream FStream; static StreamWriter SWriter; public delegate void PrintData(String s); public static void WriteConsole(string str) Console.WriteLine(0 Console,str); public static void WriteFile(string s) FStream = new FileStream(c:StoreData.txt,FileMod

9、e.Append,FileAccess.Write); SWriter = new StreamWriter(FStream); s = s + File; SWriter.WriteLine(s); SWriter.Flush(); SWriter.Close(); FStream.Close(); public static void DisplayData(PrintData PMethod) PMethod(This should go to the); public static void Main() PrintData MlDelegate = new PrintData(Wri

10、teConsole); MlDelegate+=new PrintData(WriteFile); DisplayData(MlDelegate); MlDelegate-=new PrintData(WriteFile); DisplayData(MlDelegate); Console.Read(); 绑定到委托绑定到委托取消绑定取消绑定第12页/共26页13事件抢答者 宣布人宣布人抢答者“请听题”集中注意力聆听其他人事件源事件的发布者事件的订阅人未订阅该事件 定义事件 为对象订阅该事件 将发生的事件通知给订阅人第13页/共26页14定义事件访问修饰符 event 委托名 事件名; 语法p

11、ublic delegate void delegateMe();private event delegateMe eventMe;第14页/共26页15订阅事件 eventMe += new delegateMe(objA.Method);eventMe += new delegateMe(objB.Method);第15页/共26页16通知订阅对象 if(condition) eventMe();调用订阅特定事件的对象的所有委托第16页/共26页17定义一个事件:定义一个事件:在发布者类中事件的定义包括代理的声明和基于代理的事件的声在发布者类中事件的定义包括代理的声明和基于代理的事件的声明

12、。明。下面的代码定义了一个名为下面的代码定义了一个名为TimeToRiseTimeToRise的代理和一个名为的代理和一个名为RingAlarmRingAlarm的事件,当它被引发时,调用的事件,当它被引发时,调用TimeToRiseTimeToRise代理:代理:public delegate void TimeToRise();private event TimeToRise RingAlarm;使用带事件的代理(续)第17页/共26页18订阅事件:订阅事件:发布者类事件需要与它的处理程序关联。发布者类事件需要与它的处理程序关联。事件处理程序是使用代理关联的。事件处理程序是使用代理关联的。

13、当发布者对象产生事件的时候,订阅对象关联方法,它需要被调当发布者对象产生事件的时候,订阅对象关联方法,它需要被调用。用。需求应该使用事件实现。下面的代码显示了需求应该使用事件实现。下面的代码显示了StudentStudent类如何订阅名类如何订阅名为为TimeToRiseTimeToRise的事件:的事件:Student PD= new Student();RingAlarm = new TimeToRise(PD.WakeUp);使用带事件的代理(续)第18页/共26页19通知订阅者事件:通知订阅者事件:订阅者对象将订阅者对象通知发布者对象。事件被产生以通知处订阅者对象将订阅者对象通知发布者

14、对象。事件被产生以通知处理程序。理程序。在你想通知事件给事件的订阅者的地方写出这个代码块:在你想通知事件给事件的订阅者的地方写出这个代码块:if (RingAlarm != null)RingAlarm( );使用带事件的代理(续)第19页/共26页20演示:示例 4示例class TestEventsSTAThreadstatic void Main(string args) / 委托的对象委托的对象 Delegate objDelegate = new Delegate(); / ClassA 的对象的对象 ClassA objClassA = new ClassA(); / ClassB

15、 的对象的对象 ClassB objClassB = new ClassB(); / 订阅该事件订阅该事件 objDelegate.NotifyEveryOne += new Delegate.MeDelegate(objClassA.DispMethod); objDelegate.NotifyEveryOne += new Delegate.MeDelegate(objClassB.DispMethod); objDelegate.Notify();class Delegate/ 定义委托public delegate void MeDelegate();/ 定义事件public even

16、t MeDelegate NotifyEveryOne;public void Notify()/ 如果事件不为 nullif(NotifyEveryOne != null)Console.WriteLine(触发事件:);/ 触发事件NotifyEveryOne(); class ClassApublic void DispMethod()Console.WriteLine(“Class A 已接到已接到 NotifyEveryOne 事件的通知!事件的通知!); / 第二个类第二个类class ClassBpublic void DispMethod()Console.WriteLine(

17、“Class B 已接到已接到 NotifyEveryOne 事件的通知!事件的通知! );第20页/共26页21问题描述:问题描述: 在一个空调制造公司,工作时间是从上午在一个空调制造公司,工作时间是从上午9点到下午点到下午6点。公司的管理是灵活的,它允点。公司的管理是灵活的,它允许工人晚到一个小时。当他们到达公司的许工人晚到一个小时。当他们到达公司的前台的时候,工人的到达时间是电子记录前台的时候,工人的到达时间是电子记录在日志文件中的。用于记录每个工人出勤在日志文件中的。用于记录每个工人出勤的程序需要记录适当的信息。的程序需要记录适当的信息。 帮助公司设计一个记录出勤的日志程序。帮助公司设计一个记录出勤的日志程序。演示:出勤日志第21页/共26页22 解决方案: 为了设计程序,你需要完成下面的任务: 确定你将在程序中使用的技术。这个技术将使你能够动态的调用相应的方法来记录出勤情况。 创建基于控制台

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论