注意:因为c#中事件是通过委托实现的,而委托不能被继承,所以导致事件只能在其定义的类中按事件名(该事件委托的参数...) 的形式触发。如果一个事件需要在派生类中被触发,可以在基类中定义一个触发该事件的方法 SendSomeEvent(),派生类中重写该方法,并调用base.SendSomeEvent();
看下面的实例:
namespace ConsoleApplication3 { class 出版社 //定义出版社类 { public delegate void 出版(); //声明事件所需的代理 public event 出版 已经出版; //事件的声明 public void 发行() //触发事件的方法 { Console.WriteLine("发行刊物"); 已经出版(); } } class 订阅者 //定义订阅者类 { public void 订阅() { Console.WriteLine("订阅者已经订阅"); } } class Program {
static void Main(string[] args) { 出版社 甲出版社=new 出版社(); 订阅者 张三=new 订阅者(); 甲出版社.已经出版+=new 出版社.出版(张三.订阅); //向事件发行者订阅一个元事件 甲出版社.发行(); //触发事件 } } }
using System;
public class Publisher //出版社 { public delegate void Publish(string name); //声明事件所需的代理 public event Publish OnPublish; //事件的声明 public void issue(string _name) //触发事件的方法 { if (OnPublish != null) { Console.WriteLine("发行刊物"); OnPublish(_name); } } }
class Subscriber //订阅者 { public void Receive(string str) //定义事件处理程序 { Console.WriteLine("订阅者" + str + "已经收到了刊物!"); } }
class story { static void Main() { Publisher Pub = new Publisher(); Subscriber zs = new Subscriber(); Pub.OnPublish += new Publisher.Publish(zs.Receive); Pub.issue("张三"); //触发事件 } }