程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 趣談c#中的委托和事件

趣談c#中的委托和事件

編輯:C#入門知識

 大學擴招後,各類大學或學院如牛毛般興起。隨之而產生的現象是大學生源質量的下降,而優質大學老師也是僧多粥少,必然使大量水平尚不達標的教師混入各類院校,使上課的精彩程度有所降低。於是,逃課的學生們也越來越多...

      作為眾多大學生中一員的本文作者,也混跡在某所二流學校裡。

      某天上課鈴響後,親愛的全哥拿著《管理信息系統》一書講課到一半,眼睛一描台下寥寥無幾昏昏欲睡的幾個“好”學生,臉上泛起陰沉的笑容,”我們來點名吧!沒到的舉手!“這話乍一出口,台下便一片大亂,美女班長急匆匆拿起手機,快速按著鍵盤編輯短信催逃課的同學來上課。

      本文的作者作為當時在場的一員,目睹當今大學課堂之怪狀,腦中立即浮現出本程序的雛形。

      首先,我們分別以三個類Teacher,Monitor,Student表示教師,班長,逃課同學,其中教師有一個點名方法,班長有個發短信通知逃課同學來上課的方法,逃課同學則有個方法表示回復班長短信通知。

      接著,我們在Teacher類中定義一個委托和與之對應的事件,分別如下:

public delegate void signHandler(bool param);
public event signHandler sign;

     再為Teacher類添加一個私有變量,該變量用以指示教師是否已點名。

private bool isSigned;

     最後是為Teacher類增加一個點名方法,方法的具體實現請看代碼

public void SignName()
{
Console.WriteLine("我是老師:不來上課?後果很嚴重!");
this.isSigned = true;
//觸發點名事件
if (sign != null)
{
sign(isSigned);
}
}

     至此,Teacher類全部完成。而代表班長的Monitor類與Teacher類非常類似,它有一個sendHandler委托,和封裝該委托的表示發通知短信的send事件。最後Monitor類還有一個SendSMS方法,它表示班長發通知短信的動作。具體實現參見代碼

class Monitor
{
public delegate void sendHandler(bool param);
public event sendHandler send;
//表示班長是否已發通知短信的私有字段
private bool isSent;
//班長看到教師點名後發短信通知沒來同學
public void SendSMS(bool param)
{
if (param)
{
Console.WriteLine("我是班長:老師點名了,快來上課,不來期末不給過!");
this.isSent = true;
//觸發發短信事件
if (send != null)
{
send(isSent);
}
}
}
}

     到此為止,大部分工作都已完成。最後出場的是表示逃課學生的Student類,該類實現非常簡單,只有一個GoToClass方法,表示該學生收到班長通知短信後回復短信並趕去課室。

class Student
{
//學生收到班長短信後去上課
public void GoToClass(bool param)
{
if (param)
{
Console.WriteLine("我是學生:報告班長,短信已收到,正趕來上課!");
}
}
}

      最後,我們來看下主程序如何實現。先分別構造教師,班長,學生的實例,再將Monitor類的SendSMS方法注冊到Teacher類的sign事件上,這樣做表示了班長的發短信方法訂閱了教師的方法,教師一點名即觸發sign事件,此時班長立刻會心的傳短信通知未到學生來上課。

      接著我們還要將逃課學生的GoToClass方法注冊到班長的send事件上,班長發短信表示教師點名了,逃課學生只得乖乖的趕去上課,學分為大嘛。

class Program
{
static void

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved