对象间通信方法之一:通过委托实现(C#语言)

来源:互联网 发布:数据资源建设 编辑:程序博客网 时间:2024/06/05 05:22

对象间通信有一种简单的方法:委托。

窗体是最常见的对象,所以窗体间的通信是对象通信的一个特殊情况,网友佚名写的文章对其进行了详细的说明,见《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以实现BA发送消息,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 Guideby: Salman Ahmed。可以在如下网址免费下载:

http://www.icsharpcode.net/TechNotes/

如果不谙英文,可以参看:

http://dev.csdn.net/develop/article/25/25417.shtm

 

 

       }