委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托用于将方法作为
参数传递给其他方法。在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名的确包括返回
值。换句话说,方法和委托必须具有相同的返回值。
public delegate void EventHandler(); //无参数,无返回值
事件则是委托的一种特殊形式,发生有意义的事情时,事件对象处理通知过程。类或对象可以通过事件向其他类
或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
public event EnentHandler Update ; //声明一个“EventHandler”的委托事件
委托和事件的使用
//通知者接口
interface Subject
{
void Notify();
string SubjectState
{
get;
set;
}
}
//StockObserve类
class StockObserver
{
//构造函数对StockObserver类进行赋值
private string name;
private Subject sub;
public StockObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
//方法“通知”
public void CloseStockMarket()
{
Console.WriteLine("{0}{1}关闭股票软件,赶快假装工作!",sub.SubjectState ,name );
}
}
//看NBA直播的同事
class NBAObserver
{
//构造函数对StockObserver类进行赋值
private string name;
private Subject sub;
public NBAObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
//方法“通知”
public void ShutDownNBADirect()
{
Console.WriteLine("{0}{1}关闭NBA直播,赶快假装工作!",sub.SubjectState ,name );
}
}
//声明委托
delegate void EventHandler();
//boss类
class Boss : Subject
{
//声明一个事件Update,类型为委托EventHandler
public event EventHandler Update ;
private string action ; //用于记录前台状态的变量
public void Notify ()
{
Update (); //在访问方法“Notify”时,调用update 事件
}
//返回和对前台状态进行读写
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
//Secretary类
class Secretary : Subject
{
//声明一个事件Update,类型为委托EventHandler
public event EventHandler Update;
private string action; //用于记录前台状态的变量
public void Notify()
{
Update(); //在访问方法“Notify”时,调用update 事件
}
//返回和对前台状态进行读写
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
客户端代码
static void Main(string[] args)
{
//老板陈
Boss chen = new Boss();
StockObserver tongshia = new StockObserver("陈易得",chen );
NBAObserver tongshib = new NBAObserver("陈德清",chen );
chen.Update +=new EventHandler(tongshia.CloseStockMarket );
chen.Update += new EventHandler(tongshib.ShutDownNBADirect );
//老板chen回来了
chen.SubjectState = "老板chen回来了!!!!";
//发出通知
chen.Notify();
}
通过 委托EventHandler将,将“看股票者(stockobserver)”的closestockmarket方法挂钩到老板的更新上,同时将Shu
tDownNBADirect的方法挂钩到update上,也就是将两个不同类的不同方法委托给老板类的更新了。
委托具有以下特点:
委托类似于 C++ 函数指针,但它们是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不必与委托签名完全匹配。
|