未使用委托、事件之前的代码 using System; class Program { static void Main(string[] args) { //实例化一个button类 Button btn = new Button(); btn.Click(); } }
//首先要定义一个Button类,里面应该有一个Click方法 public class Button { //Click方法调用固定的方法 public void Click() { ForCustome fc = new ForCustome(); fc.Button_Click(); } } //上面这个类是封装了的,用户不可见,或者理解为用户不能更
改也可以
//下面这个类提供给用户 public class ForCustome { public void Button_Click() { //用户在这里写具体的方法实现 Console.WriteLine("被点击了!"); }
} 可以看出,以上的代码实现一个按钮是可行的,但两个按钮就麻烦了。不到黄河心不甘,我们硬着头皮再写两个按钮的情况吧。 using System; class Program { static void Main(string[] args) { //实例化一个button类 Button btn = new Button(); btn.Click();
//实例化第二个button Button btn2 = new Button(); btn2.Click(); //这样写能行么?我们发现,这样写根本不行! } }
//首先要定义一个Button类,里面应该有一个Click方法 public class Button { //Click方法调用固定的方法 public void Click() { ForCustome fc = new ForCustome(); fc.Button_Click();
//很想在这里面改呀,添一个方法调用 fc.Button2_Click(); //要是再有一段条件判断的逻辑就更好了,是吧? } } //上面这个类是封装了的,用户不可见,或者理解为用户不能更改也可以
//下面这个类提供给用户 public class ForCustome { public void Button_Click() { //用户在这里写具体的方法实现 Console.WriteLine("被点击了!"); }
//添一个方法实现是必须的 public void Button2_Click() { Console.WriteLine("我是第二个被点击的按钮!"); } } 如果你是自己在试着写的话,估计你已经崩溃了,这样实现太难了!
好了,看看微软是如何解决这个问题的吧。 using System; //先声明一个委托再说,目标是要能调用ForCustome类里的方法,所以注意方法签名 public delegate void myDelegate(); public class Button { //声明一个事件,和委托相关联 public event myDelegate ClickIt; public void Click() { //可以想象,这个方法是一个封装了之前我们想要的一大段条件判断语句的“复合体” ClickIt(); } }
class Program { static void Main(string[] args) { ForCustome fc = new ForCustome();
//实例化一个button类 Button btn = new Button(); //这里,将按钮的事件和按钮事件对应的(将要触发的)方法相关联,相当于我们之前想象的注册 btn.ClickIt += new myDelegate(fc.Button_Click); btn.Click();
//实例化第二个button Button btn2 = new Button(); btn2.ClickIt+=new myDelegate(fc.Button2_Click); btn2.Click(); //这样写能行么? } }
//这个类提供给用户的,没有变化 public class ForCustome { public void Button_Click() { //用户在这里写具体的方法实现 Console.WriteLine("被点击了!"); }
//添一个方法实现是必须的 public void Button2_Click() { Console.WriteLine("我是第二个被点击的按钮!"); } }