一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题。

分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类。

作为问题的发布者,Host不知道问题如何解答。因此它只能发布这个事件,将事件委托给多个嘉宾去处理。因此在Host 类定义事件,在Guests类中定义事件的响应方法。通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件。实现过程如下:

代码其实很少下面贴出来所有代码:

QuestionArgs.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. public class QuestionArgs:EventArgs
  8. {
  9. public string Message { get; set; }
  10. }
  11. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. public class QuestionArgs:EventArgs
  8. {
  9. public string Message { get; set; }
  10. }
  11. }

Program.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Host host = new Host();
  12. host.Name = "主持人";
  13. host.args.Message = "C#的事件如何实现的?";
  14. Guests[] gArray = new Guests[3]
  15. {
  16. new GuestA(){Name = "张小三"},
  17. new GuestB(){Name = "李小四"},
  18. new GuestC(){Name = "王老五"}
  19. };
  20. //用+=号,将嘉宾的答题方法加入到委托链
  21. host.QuestionEvent += new QuestionHandler(gArray[0].answer);
  22. host.QuestionEvent += new QuestionHandler(gArray[1].answer);
  23. host.QuestionEvent += new QuestionHandler(gArray[2].answer);
  24. //触发事件
  25. host.StartAnswer();
  26. Console.ReadLine();
  27. }
  28. }
  29. }<span style="color:#ff0000;">
  30. </span>

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. Host host = new Host();
  12. host.Name = "主持人";
  13. host.args.Message = "C#的事件如何实现的?";
  14. Guests[] gArray = new Guests[3]
  15. {
  16. new GuestA(){Name = "张小三"},
  17. new GuestB(){Name = "李小四"},
  18. new GuestC(){Name = "王老五"}
  19. };
  20. //用+=号,将嘉宾的答题方法加入到委托链
  21. host.QuestionEvent += new QuestionHandler(gArray[0].answer);
  22. host.QuestionEvent += new QuestionHandler(gArray[1].answer);
  23. host.QuestionEvent += new QuestionHandler(gArray[2].answer);
  24. //触发事件
  25. host.StartAnswer();
  26. Console.ReadLine();
  27. }
  28. }
  29. }<span style="color:#ff0000;">
  30. </span>

Host.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. public delegate void QuestionHandler(object sender,QuestionArgs e);
  8. public class Host
  9. {
  10. //定义一个事件
  11. public event QuestionHandler QuestionEvent;
  12. public QuestionArgs args { set; get; }
  13. public Host()
  14. {
  15. //初始化事件参数
  16. args = new QuestionArgs();
  17. }
  18. public string Name { get; set; }
  19. public void StartAnswer()
  20. {
  21. Console.WriteLine("开始答题");
  22. QuestionEvent(this, args);
  23. }
  24. }
  25. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. public delegate void QuestionHandler(object sender,QuestionArgs e);
  8. public class Host
  9. {
  10. //定义一个事件
  11. public event QuestionHandler QuestionEvent;
  12. public QuestionArgs args { set; get; }
  13. public Host()
  14. {
  15. //初始化事件参数
  16. args = new QuestionArgs();
  17. }
  18. public string Name { get; set; }
  19. public void StartAnswer()
  20. {
  21. Console.WriteLine("开始答题");
  22. QuestionEvent(this, args);
  23. }
  24. }
  25. }

Guests.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. /// <summary>
  8. /// 父类
  9. /// </summary>
  10. public class Guests
  11. {
  12. /// <summary>
  13. /// 嘉宾姓名
  14. /// </summary>
  15. public string Name { get; set; }
  16. public virtual void answer(object sender, QuestionArgs e)
  17. {
  18. Console.Write("事件的发出者:" + (sender as Host).Name);
  19. Console.WriteLine("问题是:" + e.Message);
  20. }
  21. }
  22. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. /// <summary>
  8. /// 父类
  9. /// </summary>
  10. public class Guests
  11. {
  12. /// <summary>
  13. /// 嘉宾姓名
  14. /// </summary>
  15. public string Name { get; set; }
  16. public virtual void answer(object sender, QuestionArgs e)
  17. {
  18. Console.Write("事件的发出者:" + (sender as Host).Name);
  19. Console.WriteLine("问题是:" + e.Message);
  20. }
  21. }
  22. }

GuestC.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestC:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestC:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

GuestB.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestB:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestB:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

GuestA.cs

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestA:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace EventDemo
  6. {
  7. class GuestA:Guests
  8. {
  9. public override void answer(object sender, QuestionArgs e)
  10. {
  11. base.answer(sender, e);
  12. Console.WriteLine("{0}开始答题:我不知道", this.Name);
  13. }
  14. }
  15. }

运行结果:

一个简单的小例子让你明白c#中的委托-终于懂了!

时间: 2024-10-14 05:36:17

一个简单的小例子让你明白c#中的委托-终于懂了!的相关文章

Asp.net MVC4之 一个简单的小例子

练习: 新建一个mvc项目 要求: 有3个视图  Login Index Details 目的:感受一下MVC与传统WebForm的差异性 WebForm的请求模型 MVC请求模型 传统WebForm与MVC区别 WebForm 实际上请求的是一个页面对象 MVC 不仅请求了一个页面对象,还向服务器请求了具体的业务处理方法 程序结构如下 一,项目模板和视图引擎介绍 项目模板 基本: 一般选择这个  它会自动将一些Jquery库导入进来 Internet应用程序:外网使用的 Intranect应用

使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)

猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Networking做一个简单的多人游戏例子-3/3 7. 在网络中控制Player移动 上一篇中,玩家操

一个简单的KVO例子

一个简单的KVO例子. 两个界面,第一个界面显示名字和配偶(spouse)名字,第二个界面显示修改名字和配偶名字,返回时,将看到第一个界面的名字显示发生改变. 首先定义一个person类作为model. #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString

Cocos2d-X开发一个简单的小游戏

学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动 在做游戏前,先学一个新概念 调度器(scheduler): Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Cocos2d-x暂停时,调度器也会停止.当Cocos2d-x重新开始时,调度器也会自动继续启动. Cocos2d-x封装了一个供各种不同平台使用的调度

Java一个简单的死锁例子

内容:一个简单的死锁例子,大概的思路:两个线程A和B,两把锁X和Y,现在A先拿到锁X,然后sleep()一段时间,我们知道sleep()是不会释放锁资源的.然后如果这段时间线程B拿到锁Y,也sleep()一段时间的话,那么等到两个线程都醒过来的话,那么将互相等待对方释放锁资源而僵持下去,陷入死锁.flag的作用就是让A和B获得不同的锁. public class TestDeadLock { public void run() { MyThread mt = new MyThread(); ne

Spring简单的小例子SpringDemo,用于初略理解什么是Spring以及JavaBean的一些概念

一.开发前的准备 两个开发包spring-framework-3.1.1.RELEASE-with-docs.zip和commons-logging-1.2-bin.zip,将它们解压,然后把Spring开发包下dist目录的所有包和commons-logging包下的commons-logging-1.1.1.jar复制到名为Spring3.1.1的文件夹下.那么Spring开发所需要的包就组织好了. 二.建立项目,导入包 在项目节点上右键,Build Path/ADD Libraries/U

编写一个简单的jdbc例子程序

1 package it.cast.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 public class Base { 10 11 public static void main(String[] args) th

输出多行字符的一个简单JAVA小程序

1 public class JAVA 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("----------------------"); 6 System.out.println("|| 我要学会 ||"); 7 System.out.println("|| JAVA语言 ||"); 8 System.out.println("-------

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //