委托与事件

最近看委托与事件 收集到一些个人认为较好的例子,记录下来 希望对后来的学习者有所帮助
问:不懂得什么是委托
答:就是一个类调用另一个类的方法成员
问:为什么要用委托呢?直接调用不就好了?
答:当一个方法是多个类的公共方法的时候,往往就可以考虑使用委托
问:噢,有什么好处吗?统一到一个地方?然后修改方便?
答:形式统一,实现自便,比如事件源,他只知道当事件发生后要处理,但他不知道要如何处理,也不知道要谁来处理,这时就使用委托,相当于我要告你诽谤,但我不知道司法程序,这件事我就委托给律师帮我实现
问:那不是调用律师类的方法吗?
答:对呀,就是一个类调用另一个类的实现方法
问:然后可能有很多人要找律师?
答:不能这么理解,应该是我可以随便找个律师帮我处理,是一对多,而不是多对一,一对多是指设计期,而一对一的实现过程是在运行期
问:那么我要处理的这个方法就是 delegate?
答:对
问:它有什么好处?
答:它把调用和实现分离开来,简单地说,就是我准备好所有的相关材料,到时任何一个律师都可以按指定材料进行相关处理,而不需要依赖于某一个律师,再深一点说,就是降低类间的耦合度


using System;

using System.Text;

namespace ConsoleApplication1
{
 class Program
 {       
  static void Main(string[] args)
  {             
   MyText myText = new MyText();

   // 将事件处理程序添加到事件的调用列表中(即事件布线)
   myText.Changed += new MyText.ChangedEventHandler(myText_Changed);        
           
   string str = "";
   while (str != "quit")
   {
    Console.WriteLine("please enter a string:");
    str = Console.ReadLine();
    myText.Text = str;
   }
  }

  // 对Change事件处理的程序
  private static void myText_Changed(object sender, EventArgs e)
  {
   Console.WriteLine("text has been changed  :{0}\n" ,((MyText)sender).Text);
  }       
 } 

 public class MyText
 {
  private string _text = "";

  // 定义事件的委托
  public delegate void ChangedEventHandler(object sender, EventArgs e);

  // 定义一个事件
  public event ChangedEventHandler Changed;

  // 用以触发Change事件
  protected virtual void OnChanged(EventArgs e)
  {
   if (this.Changed != null)
    this.Changed(this, e);
  }

  // Text属性
  public string Text
  {
   get { return this._text; }
   set
   {
    this._text = value;
    // 文本改变时触发Change事件
    this.OnChanged(new EventArgs());
   }
  }
 }
}  

 

posted @ 2007-03-02 14:56  小飞龙  阅读(232)  评论(0编辑  收藏  举报