WEB开发网
开发学院软件开发C语言 我眼中委托的真正面貌(二) 阅读

我眼中委托的真正面貌(二)

 2009-05-07 08:26:49 来源:WEB开发网   
核心提示:对于上一篇随笔,不少朋友留下了很不错的见解,我眼中委托的真正面貌(二),也有不少朋友提出了很有代表性的问题,所以,我们不妨尝试一下,使用接口回调是否可以实现C#的事件机制:5(2)使用接口回调仿真控件的事件机制(尝试)首先,在正文开始之前,我想先就这些问题阐述一下自己的观点

对于上一篇随笔,不少朋友留下了很不错的见解,也有不少朋友提出了很有代表性的问题。所以,在正文开始之前,我想先就这些问题阐述一下自己的观点,也请朋友们给予批评指正:

首先来说,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("接口回调仿真事件调用成功!");

        }

    }

}

1 2 3 4 5 6  下一页

Tags:眼中 委托 真正

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接