下午上班时,听见窗外高昂的防空警报声。再次醒悟到今天可是9.18,国耻日。历史不能忘记啊……
正在看MSDN2005的章节,正是委托的章节,看了那个计算图书馆中平装平均书价格的例子,理解一番之后,就想自己也试着来一个。以前在别人的博客上也看到过张嘎子炸鬼子的例子,当时囫囵吞枣,没有仔细理解。今天算是基本理解委托的意义了,于是按自己的理解也来了个张嘎子炸鬼子的示例,顺便纪念一下9.18了。
假定鬼子在我抗日根据地扫荡,我英勇的人民奋勇反击,使用了地雷战的战术,炸得鬼子魂飞胆战。电影的一幕假定这样的:游击队员张嘎子在张家院子里埋下了地雷,几个鬼子进入了院子,埋伏在远处的张嘎子一拉弦,鬼子也就格屁了。
我们需要三个角色(类):
1、院子
class yard
{
//院子名
public string yardName;
//地雷
public Bomb BombInYard;
//鬼子
public int JapaneseNumber;
public yard(string Name)
{
yardName = Name;
Console.WriteLine("院子:{0}", yardName);
}
//鬼子进去了
public void JapaneseIn(int Number)
{
JapaneseNumber = Number;
Console.WriteLine("院子进入了{0}个鬼子", Number);
}
}
2、地雷
class Bomb
{
//地雷爆炸
public void DoBomb()
{
Console.WriteLine("鬼子被炸死了!");
}
}
3、(主角)张嘎子
class ZhangGa
{
public ZhangGa()
{
Console.WriteLine("小游击队员张嘎子登场了");
}
//放置地雷
public void SetBomb(yard yad)
{
Console.WriteLine("{0}被放置了地雷", yad.yardName);
yad.BombInYard = new Bomb();
}
//拉弦
public void PullFireLine(FireLine fire)
{
Console.WriteLine("嘎子拉弦了");
fire();
}
}
4、接下来是不可忽略的另一个重要角色——导火索
public delegate void FireLine();
几位角色设置好了以后,好戏开场了。
class Movie
{
static void Main()
{
Console.WriteLine("电影开始了");
//主角 张嘎子 登场
ZhangGa zg = new ZhangGa();
//张家院子
yard yardZhang = new yard("张家院子");
//嘎子埋地雷了
zg.SetBomb(yardZhang);
//3个鬼子进了张家院子
yardZhang.JapaneseIn(3);
//张嘎子拉弦了
zg.PullFireLine(new FireLine(yardZhang.BombInYard.DoBomb));
//vs2005下上句可替换为下面这句
//zg.PullFireLine(yardZhang.BombInYard.DoBomb);
Console.WriteLine("电影结束了");
Console.ReadLine();
}
}
执行效果:
各位看官,看懂上面的程序了吗?可以代码拷贝到vs2003里试试,如果是vs2005的环境,在电影类的main函数里,拉弦的方式也可改成代码里那种简单的写法,效果是一样的。
讲一讲自己理解的委托。委托即是,把委托方法对象作为参数,把一个类的方法连接在另一个类的某个方法里,以完成一件完整的事情,而在两个类里各自完成与自己相关的步骤。需要连接的方法,参数类型必须和委托方法对象类型一致。
以上的例子,我把导火索作为一个委托方法对象(这里的委托方法有点特殊,没有设置委托方法对象的参数,如果有的话,地雷爆炸的方法的参数应该与此一致),把地雷爆炸的方法连接了张嘎子拉弦的方法里,嘎子作的动作当然只是拉弦,然后等待地雷的反应。只要不是假冒伪劣的地雷,地雷自己是知道怎么去爆炸的。所以,嘎子一拉弦,地雷也就爆了。伟大的抗日小英雄,勇敢的游击队员,坚强的革命战士,在这一刻,神灵附体了……