对象间通信有一种简单的方法:委托。
窗体是最常见的对象,所以窗体间的通信是对象通信的一个特殊情况,网友佚名写的文章对其进行了详细的说明,见《Vs2003多窗口下的复杂数据传递》一文:
http://www.cnblogs.com/xxm/archive/2006/07/01/440392.html
相信大家如果理解了上面这篇文章,也就会用委托进行对象间的通信了。下面根据上面这个例子解释一下每一步的作用,并将使用它的场合由特殊(窗体间)引向一般(对象间)希望对大家理解有所帮助:
其实要定义这个通信过程,主要分为三个部分:接收消息的类A中的代码和发送消息的类B中的代码和委托类C。
首先要定义委托类C:
环境:winXPsp2 + VS2003.NET
namespace Felomeng.委托通信演示
{
public class C
{
public delegate void EventNameHandler();//定义委托,用于类间通信其中“EventName”是用户将要定义的触发通信事件的名称,下同。
public class EventNameEvent//定义中介类,主要的中间变量都在此定义
{
public type Array1;//中间变量1,可以为任意类型
public type Array2;//中间变量2,……
………… //中间变量列表
public event EventNameHandler Evented;//定义下载状态触发器Evented
public void Eventing()//触发事件
{
if ( Evented != null )
{
Evented();//如果触发则执行EventEve()
}
}
}
}
}
再编写要接受消息的类A中代码:
namespace Felomeng.委托通信演示
{
public class A
{
//……
//……类A中的其它代码
//……
C.EventNameEvent eventNameEvent = new C.EventNameEvent();//实例化一下中介类的对象
private void eventNameEvent_Evented()//定义一个事件触发后执行的方法
{
//根据类B传递过来的值进行相应的操作,主要是对本类内的对象进行控制,如改变控件属性,更改变量值等。如
if ( Array1 == 0 )
{
//控制代码
}
}
public A()
{
eventNameEvent.Evented += new C.EventNameHandler ( eventNameEvent_Evented );//在类B中添加事件,用于触发过程eventNameEvent_Evented,括号内的事件参数名eventNameEvent_Evented必须与上面定义的事件触发后执行的方法同名,其实是实例化一个public event的对象
B b = new B( eventNameEvent );//调用B的重载实例化B以实现B向A发送消息,B的重载定义见下面B内的代码。
//执行B的对象b的代码
//……
//……类A中的其它代码
//……
}
}
最后编写发送消息的类B中的代码:
namespace Felomeng.委托通信演示
{
public class B
{
//……
//……类B中的其它代码
//……
private C.EventNameEvent EventedEvnet;//实例化一个类
public B( C.EventNameEvent eventedEvnet ):this()//定义B的一个重载
{
this.EventedEvnet = eventedEvnet;//关联触发事件
}
private void SomeMethod()
{
EventedEvnet.Array1 = 0;//改变中间变量的值
…………………… //改变中间变量的值
EventedEvnet.Eventing();//触发事件(执行类A中定义的触发事件执行的方法),向类A发送相应的消息(主要是变量Array1,Array2,……等的值的变化后的值
}
//……
//……类B中的其它代码
//……
}
}
《Vs2003多窗口下的复杂数据传递》一文中,网友佚名的例子非常简洁,就把中介类写在了主窗体这个类当中,这样做是可以的。但如果要做工程(尤其是大量代码的情况),这样做就不太合适了。所以笔者在这里所举的例子中,有意识将三个类分别放入三个文件,目的就是要提大家一定要养成按照编码规范编写程序的习惯。这样往往会使程序更加清晰易懂,从而使以后的编码及程序的维护变地简单了。关于编码规范,笔者推荐::《C# Coding Style Guide》by: Salman Ahmed。可以在如下网址免费下载:
http://www.icsharpcode.net/TechNotes/
如果不谙英文,可以参看:
http://dev.csdn.net/develop/article/25/25417.shtm
}