本文没有任何概念介绍,直接通过代码的方式去讲解
首先,我们要知道,什么情况下要用到委托和事件:
请看下面的一个场景:
学校要组织一场辩论会,挑选了两组学生为代表,一面是正方,一面是反方
然后有一名主持人,主持人会组织让哪一方先发言,主持人说结束双方撤离(举个例子,别杠)
而想要说什么,主持人并不关心
那么,有脑子反应快的同学则会说了:
这个直接用if语句不就行了嘛
if(A方代表发言)
{
A方学生发言
}
if(B方代表发言)
{
B方学生发言
}
if(自由辩论)
{
双方劈里啪啦在讲
}
if(辩论结束)
{
双方撤离
}如果真的有这么简单,那我还写这篇文章干嘛呢?
仔细想想,假如是个课堂,学生可能不止一个,这样的话,每个学生都要写一个IF分支?
在辩论会中,学生无需关心发生的其他事情,只等待主持人的发言信号
主持人让发言,就相当于告诉了全部学生,学生们就会根据自己所在的组,进行发言或做其他事情
开始正题
我们首先要定义三个类(可以是多个,想几个都行),分别为主持人(Host),正方(GroupA),反方(GroupB)
/// <summary>
/// 主持人
/// </summary>
public class Host
{
}
/// <summary>
/// 正方
/// </summary>
public class GroupA
{
}
/// <summary>
/// 反方
/// </summary>
public class GroupB
{
}主持人中有 单方发言 自由辩论 撤离三个方法,其中,单方发言有一个形参,就是哪一方(正方,反方),正方和反方各自有一个发言和撤离方法。
/// <summary>
/// 主持人
/// </summary>
public class Host
{
/// <summary>
/// 发言
/// </summary>
/// <param name="group">组A还是组B</param>
public void speechDirective(string group)
{
}
/// <summary>
/// 自由辩论
/// </summary>
public void freeDebateDirective()
{
}
/// <summary>
/// 散场
/// </summary>
public void overDirective()
{
}
}
/// <summary>
/// 正方
/// </summary>
public class GroupA
{
/// <summary>
/// 发言
/// </summary>
public void speech()
{
}
/// <summary>
/// 散场
/// </summary>
public void over()
{
}
}
/// <summary>
/// 反方
/// </summary>
public class GroupB
{
/// <summary>
/// 发言
/// </summary>
public void speech()
{
}
/// <summary>
/// 散场
/// </summary>
public void over()
{
}
}到此,三个类已经构造完毕,
那么,怎样让两方根据主持人的指令去发言呢?
我们要在主持人中,采用一种方法,把指令传出去,
在主持人之前,我们要跟别定义一个
带形参的发言委托SpeechEventHanlder
不带形参的自由辩论委托FreeDebateEventHanlder
不带形参的散场委托OverEventHanlder
命名规则就是传递的方法名后+EventHanlder,不要问我为什么,介绍为什么的文章多的是,可以自行去百度或Google
当然,你也可以不遵循命名规则,对程序的运行和编译无任何影响,只是增加了自己或别人日后阅读代码的难度。
delegate void SpeechEventHanlder(string group);//发言委托 delegate void FreeDebateEventHanlder();//自由辩论委托 delegate void OverEventHanlder();//散场委托
然后在主持人中定义两个事件。这个类似于大家在WinForm中拖出Button双击它即可编辑它的事件。
public event SpeechEventHanlder Speech;//发言事件 public event FreeDebateEventHanlder FreeDebate;//自由辩论事件 public event OverEventHanlder Over;//散场事件
事件定义好之后,我们就可以在主持人中调用这个事件了。那么,如果其他学生订阅了这个事件,便可以自动执行了。
/// <summary>
/// 发言
/// </summary>
/// <param name="group">组A还是组B</param>
public void speechDirective(string group)
{
Console.WriteLine("主持人:请{0}方代表发言",group);
//调用发言事件,并传正方还是反方
if (Speech!=null)
{
Speech(group);
}
}
/// <summary>
/// 自由辩论
/// </summary>
public void freeDebateDirective()
{
Console.WriteLine("主持人:请双方自由辩论");
//调用自由辩论事件
if (FreeDebate!=null)
{
FreeDebate();
}
}
/// <summary>
/// 散场
/// </summary>
public void overDirective()
{
Console.WriteLine("主持人:辩论会就到这里,散会");
//调用散会事件
if (Over!=null)
{
Over();
}
}同样,不要问我为什么这么写,按照上述操作即可。一旦熟练这种方法,自然就体会其中含义了。
那么,两方学生们必须知道主持人是谁吧,才能听谁的话,因此,在GroupA和GroupB中,都需要声明一个Host,这个声明可以通过GroupA和GroupB的构造函数进行实例化,实例化之后,就可以在GroupA和GroupB中订阅Host中的事件了。
完整代码
class Program
{
public static void Main(string[] args)
{
Host host = new Host();
GroupA a = new GroupA(host);//正方
GroupB b = new GroupB(host);//反方
//host.speechDirective("正");
//host.speechDirective("反");
//host.freeDebateDirective();
host.overDirective();
Console.ReadLine();
}
}
/// <summary>
/// 发言委托
/// </summary>
/// <param name="group">正/反方</param>
public delegate void SpeechEventHanlder(string group);
/// <summary>
/// 自由辩论委托
/// </summary>
public delegate void FreeDebateEventHanlder();
/// <summary>
/// 散场委托
/// </summary>
public delegate void OverEventHanlder();
/// <summary>
/// 主持人
/// </summary>
public class Host
{
public event SpeechEventHanlder Speech;//发言事件
public event FreeDebateEventHanlder FreeDebate;//自由辩论事件
public event OverEventHanlder Over;//散场事件
/// <summary>
/// 发言
/// </summary>
/// <param name="group">组A还是组B</param>
public void speechDirective(string group)
{
Console.WriteLine("主持人:请{0}方代表发言",group);
//调用发言事件,并传正方还是反方
if (Speech!=null)
{
Speech(group);
}
}
/// <summary>
/// 自由辩论
/// </summary>
public void freeDebateDirective()
{
Console.WriteLine("主持人:请双方自由辩论");
//调用自由辩论事件
if (FreeDebate!=null)
{
FreeDebate();
}
}
/// <summary>
/// 散场
/// </summary>
public void overDirective()
{
Console.WriteLine("主持人:辩论会就到这里,散会");
//调用散会事件
if (Over!=null)
{
Over();
}
}
}
/// <summary>
/// 正方
/// </summary>
public class GroupA
{
Host host;
public GroupA(Host host)
{
this.host = host;
//开始绑定事件
host.Speech += new SpeechEventHanlder(a_SpeechEvent);
host.FreeDebate += new FreeDebateEventHanlder(a_FreeDebateEvent);
host.Over += new OverEventHanlder(a_OverEvent);
}
/// <summary>
/// 主持人发出的发言指令
/// </summary>
/// <param name="group">如果主持人说正方,那么正方发表言论</param>
void a_SpeechEvent(string group)
{
if(group.Equals("正"))
{
speech();
}
}
/// <summary>
/// 主持人发出的自由辩论指令
/// </summary>
void a_FreeDebateEvent()
{
speech();
}
/// <summary>
/// 主持人发出的散场指令
/// </summary>
void a_OverEvent()
{
over();
}
/// <summary>
/// 发言
/// </summary>
public void speech()
{
Console.WriteLine("正方选手正在说话·))");
}
/// <summary>
/// 散场
/// </summary>
public void over()
{
Console.WriteLine("正方选手撤离现场");
}
}
/// <summary>
/// 反方
/// </summary>
public class GroupB
{
Host host;
public GroupB(Host host)
{
this.host = host;
host.Speech += new SpeechEventHanlder(a_SpeechEvent);
host.FreeDebate += new FreeDebateEventHanlder(a_FreeDebateEvent);
host.Over += new OverEventHanlder(a_OverEvent);
}
/// <summary>
/// 主持人发出的发言指令
/// </summary>
/// <param name="group">如果主持人说反方,那么反方发表言论</param>
void a_SpeechEvent(string group)
{
if (group.Equals("反"))
{
speech();
}
}
/// <summary>
/// 主持人发出的自由辩论指令
/// </summary>
void a_FreeDebateEvent()
{
speech();
}
/// <summary>
/// 主持人发出的散场指令
/// </summary>
void a_OverEvent()
{
over();
}
/// <summary>
/// 发言
/// </summary>
public void speech()
{
Console.WriteLine("反方选手正在说话·))");
}
/// <summary>
/// 散场
/// </summary>
public void over()
{
Console.WriteLine("反方选手撤离现场");
}
}写在最后
近期发现某网站采集本网站的内容,并且不加来源,网址和网站名称我就不贴出来了,1是不想招惹仇家,2是不想给他们做外链。还请你们自重,谢谢

微信扫码查看本文
发表评论