teacher and student(reship)
关于委托和事件的示例
!关于委托和事件,许多高手都已经对此进行了很详尽的描述,昨晚突然想到一个情景,于是今天写了这个委托和事件的例子出来,纯粹是为了练习一下,也希望这篇随笔对您有帮助!情景大概是这样的:有一个老师,他教好几个班级,然后每次考试后,他都会小小惩罚成绩低于几个班级成绩的平均分的同学,同学们自然会很怕受罚啊,考完试立刻打电话问老师。老师刚开始能够很耐心的回答:张三,你多少分;李四你多少分。。。日子久了,可就折腾人了,刚好这个老师刚学了委托和事件,就写了个小程序。这个程序的功能是,一旦学生问成绩,立刻交给这个程序去处理,然后程序显示结果,老师当然就可以在旁边轻松地喝茶咯,哈哈,看看代码吧!
首先写个学生实体类,简单的啦
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事件只是触发前多检查了该事件是否为空。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 }
接下来要写事件参数类,也就是上面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)结果属性为可写的哦;{
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;
}
}
接下来是老师的部分了,他要订阅学生问成绩这个事件。然后自动给出判断!
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保存数据,更多的功能和判断自己去拓展吧!这里只是简单的判断加打印!包涵包涵!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;
}
}
}
最后是测试拉(用程序台)
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 }
当老师注册了学生问成绩的事件后,学生一问老师,结果就自动出来了,老师呢,一边喝茶一边感叹了解只知识的好处啊,哈哈。。。
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 }