猫 老鼠 人 理解委托和事件以及联动。
今天准备了一下面试题,因为委托和事件我一直没有涉足,对这个一知半解,不太会,网上有一道面试题,大概意思就是,猫一叫,老鼠就跑,人就醒。要求猫叫后触发老鼠跑和人醒。
没搞清委托之前,这样写最好。在猫的CryOut中增加老鼠跑或者人醒。
但是这种方法不符合出题者的初衷,想想,如果一次猫叫有一只老鼠跑,另一次猫叫有两只老鼠跑,这样如何解决呢?难道修改CryOut代码?显然这样是错误的。
这道题其实是要说明delegate委托和event事件的用法,以及接口和或者抽象类的使用,这里先不说接口和抽象类。
委托是c#中一种类型。
一个委托变量中,存放了多个符合委托所要求的函数的指针(地址),当委托执行时,依次执行这些函数。
而事件,就是委托的一种特殊的变量。
以上这两个问题,我想了好久才搞明白。
由此,猫和老鼠以及人的问题就可以理解为,给猫定义一个委托变量,然后把老鼠和人的在听见猫叫后的反应函数放到这个委托变量中,当猫叫时,执行这个委托,自然就执行了这个委托中所包含的函数。
首先定义一个委托
delegate void MyEventHandler();
然后分别在老鼠和人中定义相关符合委托调用的函数。
class Mouse{
public void MouseRun()
{
Console.WriteLine("Let's go,Friends");
}
}
class People{
public void PeoPleRun()
{
Console.WriteLine("I'm Waking");
}
}
因为是猫叫触发,因此这个委托变量应该定义在猫的类中,并且在猫叫的时候执行委托中的函数。
class Cat{
public MyEventHandler myHandler;
public void Cry(){
Console.WriteLine("I'm crying");
if(myHandler!=null){ myhandler(); }
}
}
好的,差不多了,剩下来就是如何把老鼠和人的函数增加到这个myHandler变量中去。这个可以用老鼠和人的构造函数,将Cat的实例传入构造函数,然后在委托中增加函数。贴下全部代码。
OK,可以说的是,event关键字可以不要,至于要不要event,还弄的不是很清楚。以后再研究下。
下次再将老鼠和人的方法抽象一个接口。
以上的描述或有不太准确的地方,因为都是个人理解,可能会和真词不同,理解。
今天准备了一下面试题,因为委托和事件我一直没有涉足,对这个一知半解,不太会,网上有一道面试题,大概意思就是,猫一叫,老鼠就跑,人就醒。要求猫叫后触发老鼠跑和人醒。
没搞清委托之前,这样写最好。在猫的CryOut中增加老鼠跑或者人醒。
Code
但是这种方法不符合出题者的初衷,想想,如果一次猫叫有一只老鼠跑,另一次猫叫有两只老鼠跑,这样如何解决呢?难道修改CryOut代码?显然这样是错误的。
这道题其实是要说明delegate委托和event事件的用法,以及接口和或者抽象类的使用,这里先不说接口和抽象类。
委托是c#中一种类型。
一个委托变量中,存放了多个符合委托所要求的函数的指针(地址),当委托执行时,依次执行这些函数。
而事件,就是委托的一种特殊的变量。
以上这两个问题,我想了好久才搞明白。
由此,猫和老鼠以及人的问题就可以理解为,给猫定义一个委托变量,然后把老鼠和人的在听见猫叫后的反应函数放到这个委托变量中,当猫叫时,执行这个委托,自然就执行了这个委托中所包含的函数。
首先定义一个委托
delegate void MyEventHandler();
然后分别在老鼠和人中定义相关符合委托调用的函数。
class Mouse{
public void MouseRun()
{
Console.WriteLine("Let's go,Friends");
}
}
class People{
public void PeoPleRun()
{
Console.WriteLine("I'm Waking");
}
}
因为是猫叫触发,因此这个委托变量应该定义在猫的类中,并且在猫叫的时候执行委托中的函数。
class Cat{
public MyEventHandler myHandler;
public void Cry(){
Console.WriteLine("I'm crying");
if(myHandler!=null){ myhandler(); }
}
}
好的,差不多了,剩下来就是如何把老鼠和人的函数增加到这个myHandler变量中去。这个可以用老鼠和人的构造函数,将Cat的实例传入构造函数,然后在委托中增加函数。贴下全部代码。
Code
OK,可以说的是,event关键字可以不要,至于要不要event,还弄的不是很清楚。以后再研究下。
下次再将老鼠和人的方法抽象一个接口。
以上的描述或有不太准确的地方,因为都是个人理解,可能会和真词不同,理解。