关于委托和事件的示例(原创)

!关于委托和事件,许多高手都已经对此进行了很详尽的描述,昨晚突然想到一个情景,于是今天写了这个委托和事件的例子出来,纯粹是为了练习一下,也希望这篇随笔对您有帮助!
情景大概是这样的:有一个老师,他教好几个班级,然后每次考试后,他都会小小惩罚成绩低于几个班级成绩的平均分的同学,同学们自然会很怕受罚啊,考完试立刻打电话问老师。老师刚开始能够很耐心的回答:张三,你多少分;李四你多少分。。。日子久了,可就折腾人了,刚好这个老师刚学了委托和事件,就写了个小程序。这个程序的功能是,一旦学生问成绩,立刻交给这个程序去处理,然后程序显示结果,老师当然就可以在旁边轻松地喝茶咯,哈哈,看看代码吧!
首先写个学生实体类,简单的啦
 1 class student
 2     {
 3         public delegate void requestHandle(object student,askEventArgs ev);
 4         public event requestHandle askResult;
 5         //定义触发事件的方法,放出消息好让老师知道(就是订阅事件)
 6         private string _name;
 7       
 8         public student(string name)
 9         {
10             this._name = name;
11           
12         }
13         public string Name
14         {
15             get { return this._name; }
16       
17         }
18         public void onAskResult(object student, askEventArgs resultInformation)
19         {
20             if (askResult != null)
21             {
22                 askResult(student, resultInformation);
23             }
24         }
25         public void askTeacher()
26         {
27             askEventArgs result = new askEventArgs(false,this.Name);
28             //调用触发事件的方法
29             onAskResult(this,result);
30         }
31     }
这样,传入一个学生名字实例化一个新对象,学生一旦askTeacher(问老师咯),就触发了askResult事件,onAskResult()相对于askResult事件只是触发前多检查了该事件是否为空。
接下来要写事件参数类,也就是上面onAskResult的参数类型-askEventArgs类,代码如下:
 class askEventArgs :EventArgs
    {
        
private bool _result;
        
private string _name;
        
public bool result 
        {
            
get { return this._result; }
            
set { this._result = value; }
        }
        
public string Name
        {
            
get { return this._name; }

        }
        
public askEventArgs(bool unAsk,string name)
        {
            
this._result =unAsk;
            
this._name = name;
        }
    }
这个参数类保存了学生的名字和即将告知的结果,(result)结果属性为可写的哦;
接下来是老师的部分了,他要订阅学生问成绩这个事件。然后自动给出判断!

 public Teacher() { }
        
public void recevid(student stu)
        {
            stu.askResult 
+= new student.requestHandle(feedBack);
        }

        
public void feedBack(object stu, askEventArgs ev)
        {
            student s
=(student)stu;
            
if (getResult(s.Name))
            {
                ev.result 
= true;
                Console.Write(
"考试人:"+ev.Name+"\n"+"成绩评价:不错!\n");
                Console.ReadLine();
            }
            
else 
            {
                Console.Write(
"考试人:" + ev.Name + "\n" + "成绩评价:不及格,要努力!\n");
                Console.ReadLine();
            }
        }
        
public bool getResult(string name) 
        {
            Hashtable hs 
= new Hashtable();
            hs.Add(
"张三",90);
            hs.Add(
"王五",85);
            hs.Add(
"李四",59);
            
if (Convert.ToInt32( hs[name]) > 60)
            {
                
return true;
            }
            
else 
            {
                
return false;
            }
        }
    }
这里简化了很多,直接用一个hashTable保存数据,更多的功能和判断自己去拓展吧!这里只是简单的判断加打印!包涵包涵!
最后是测试拉(用程序台)
 1  static void Main(string[] args)
 2         {
 3            
 4                 string name = Console.ReadLine();
 5                 student stu = new student(name);
 6                 Teacher tea = new Teacher();
 7                 tea.recevid(stu);
 8                 stu.askTeacher();
 9             
10           
11             
12            
13          
14         }
当老师注册了学生问成绩的事件后,学生一问老师,结果就自动出来了,老师呢,一边喝茶一边感叹了解只知识的好处啊,哈哈。。。
posted @ 2007-08-12 14:53  Awen  阅读(853)  评论(3编辑  收藏  举报