我眼中委托的真正面貌(二)
2009-05-07 08:26:49 来源:WEB开发网对于上一篇随笔,不少朋友留下了很不错的见解,也有不少朋友提出了很有代表性的问题。所以,在正文开始之前,我想先就这些问题阐述一下自己的观点,也请朋友们给予批评指正:
首先来说,feiyang朋友提出了有关委托与函数指针间的连带关系。我很赞同这样的说法。
其实,对C++有所了解的朋友都会知道:一个类内部所包含的方法,其实在类内部仅仅表现为一个函数指针,其实现部分并未占用类的内存空间。假如我们在一个类内部声明了一个委托实例对象,同时为它挂载了其他类内部的一个方法(当然,这个方法必须是共有型的),这样,在本类内部就同样拥有了这个方法的函数指针(可以理解为它被存储在委托对象的内部)——这就相当于在本类内部声明了一个一模一样的方法。
而事实上,假如我们通过已声明的委托对象来调用相应的方法,C#的编译器将自动将其作为本类的声明方法来对待(从C#编译器的安全角度来论证,这个说法是行得通的)。其实目标委托对象并非真正意义上的类方法,而仅仅只是作为一个目标方法的代理方法而存在,这便是委托(代理)一词的由来。
另外feiyang兄也提到了有关委托与接口回调机制的区别与联系问题,我已经在上一篇随笔中给予了回复,其中谈到了有关接口回调方法所存在的一些限制。在这里,我们不妨尝试一下,使用接口回调是否可以实现C#的事件机制:
5(2)使用接口回调仿真控件的事件机制(尝试)
首先,我们建立一个控件项目,代码如下:
namespace InfceCalbckEvCtrl
{
public partial class UserControl1 : UserControl
{
//声明接口类型
public interface ICallbackEvn
{
void ShowObjTxt(string Txt);
}
//定义(但不实例化)接口对象
public ICallbackEvn ObjCallEvn;
public UserControl1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ObjCallEvn.ShowObjTxt("接口回调仿真事件调用成功!");
}
}
}
更多精彩
赞助商链接