委托与事件
最近看委托与事件 收集到一些个人认为较好的例子,记录下来 希望对后来的学习者有所帮助
问:不懂得什么是委托
答:就是一个类调用另一个类的方法成员
问:为什么要用委托呢?直接调用不就好了?
答:当一个方法是多个类的公共方法的时候,往往就可以考虑使用委托
问:噢,有什么好处吗?统一到一个地方?然后修改方便?
答:形式统一,实现自便,比如事件源,他只知道当事件发生后要处理,但他不知道要如何处理,也不知道要谁来处理,这时就使用委托,相当于我要告你诽谤,但我不知道司法程序,这件事我就委托给律师帮我实现
问:那不是调用律师类的方法吗?
答:对呀,就是一个类调用另一个类的实现方法
问:然后可能有很多人要找律师?
答:不能这么理解,应该是我可以随便找个律师帮我处理,是一对多,而不是多对一,一对多是指设计期,而一对一的实现过程是在运行期
问:那么我要处理的这个方法就是 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());
}
}
}
}