技术开发 频道

使用.NET 应用程序的Classic COM 组件


   这是你得到的输出情况:

Good Morning 
Bonjour
   在上面的例子宣告了一个SayGoodMorning委托。然后把委托用线路连接起来,以此来引用HelloWorld对象的SpeakEnglish 和SpeakFrench方法。所有的要求就是SpeakEnglish 和SpeakFrench和SayGoodMorning委托有同样的标记式。通过示例委托,可以完成引用,就好像它是一个对象,并作为参数在引用方法中传递。这个引用方法既可以是一个实例方法或这是一个类型的静态方法。这使得委托被称为一流的以对象为目标的成员,而且它们类型安全,处理起来也很安全。.NET事件处理模式主要建立在委托事件模式基础之上,让我们看一下下面的例子。

...... 

// 创建一个按钮
private System.Windows.Forms.Button AngryButton = new Button();

....

// 在按钮的单击事件列表上增加一个委托
AngryButton.Click += new System.EventHandler(AngryButton_Click);

.....

// 委托的句柄函数
protected void AngryButton_Click(object sender,EventArgs e)
{
MessageBox.Show("Please Stop clicking me !!");
}

.......
   当得应用程序在处理控件时,想要重新收到特定的通知,它建立一个事件处理程序委托得新实例,此事件处理程序委托包含有一个实际处理程序功能引用,而此实际处理程序功能将处理由控件引起得事件。在上面得例子中,事件处理程序委托包含了一个AngryButton_Click方法引用。AngryButton_Click方法需要拥有和事件处理程序委托一样的方法标记式.。下面就是System.EventHandler 委托的样子:

public delegate void EventHandler(object sender, EventArgs e);
   然后,事件处理程序委托实例必须被补充到委托实例的Click事件表中。通过使用C#操作器,例如:+= and -=,它们都是委托.Combine and 委托.Remove方法的包装器,扩展System.Multicast委托的委托,允许你将多个处理程序功能增添到委托调用表中。使用一个事件给用户提供了一个十分安全的方法,仅仅只需要通过使用+= and -=操作器,就能把委托实例移动到事件,不会意外地多写调用表。当控件引起一个事件,每一个被补充到按钮Click事件的委托都会被调用,而且委托会把它发送到它所引用的正确的处理程序功能上。

   在例子中,无论什么时候,按钮中的Click 事件发生后,这个调用将会被发送到AngryButton_Click方法。我猜想这个将会为.NET结构中事件处理机制的委托和事件扮演的角色这一方面提供一个很好的方案。我要解释委托是怎样工作的原因就是——它是.NET事件处理模式内其中一个主要的推动力量,而且理解并欣赏.NET应用程序运用委托怎样从Classic COM 组件预定事件通知这一点非常重要。


0
相关文章