用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
来源:互联网 发布:为什么移民美国知乎 编辑:程序博客网 时间:2024/06/05 00:40
(原创文章,转载请注明来源:http://blog.csdn.net/hulihui) 不谈C/C++,就从对象和类型考虑.NET委托(delegate),笔者的看法是:函数是对象、委托是函数对象的类型。
教科书上讲:具有同属性的实体抽象成类型。那么,程序代码中函数的属性是啥?就是函数签名,即函数返回类型、函数参数类型。进一步,具有相同属性的函数抽象成啥呢?就是.NET中所谓的委托(delegate),它就是函数的类型。与普通对象与类型不同,委托的对象(函数)可以不要new操作符号创建,因为函数已经存在于代码中。委托自己没有成员,它只是一类函数的代表而已,所以叫做delegate,也可翻译成代表。
举一个把函数作为参数调用的例子。
int fun2(int n)
for(int k = 1; k <= n; k++)
{
m += k * k;
}
return m
}
int fun3(int n)
{
int m = 0;
for(int k = 1; k <= n; k++)
{
m += k * k * k;
}
return m
}
函数fun2计算1到n的平方和,函数fun3计算1到n的立方和。它们的属性相同:返回int、参数int。于是定义这两个函数的类型——一个委托TSum如下。注意,TSum是类型(Type),其返回类型、参数类型与fun2、fun3相同。
public delegate int TSum(int n);
这样,就可以定义调用函数的函数output(),如:
void output(TSum sum)
{
MessageBox.Show(sum(10).ToString());
}
最后,用 output(fun2)、output(fun3),将显示10以内平方数和、立方数和。当然,如果完全按照面向对象方式,可以先创建两个TSum实例,然后调用,如:
TSum f2 = new TSum(fun2);
TSum f3 = new TSum(fun3);
output(f2);
output(f3);
后一种方式产生的f2、f3在内部机制上与output(fun2)、output(fun3)有较大的区别,详细阐述见Jeffrey Richter的名著《框架设计(第2版:CLR Via C#》。
.NET事件机制也可以理解:事件是函数、委托规定了函数的属性。在激发事件时,必须判断事件是否注册,即实现如下类似代码:
if(OnClickEvent != null) // 相当于判断 OnClickEvent 对象是否存在
{
OnClickEvent(this, new ClicktEventArgs(...));
}
刚接触.NET时,总觉得委托delegate难以理解,笔者认为关键原因是:没有从面向对象的观点上考虑函数与委托的关系,而是从传统的C/C++、函数指针、函数回调、调用安全、事件机制等方面讲委托。事实上,从面向对象的观点看,函数是实体,那么就可认为是对象,再抽象就成函数类型——委托了。这样想,许多原先模糊的观念就清晰多了。
教科书上讲:具有同属性的实体抽象成类型。那么,程序代码中函数的属性是啥?就是函数签名,即函数返回类型、函数参数类型。进一步,具有相同属性的函数抽象成啥呢?就是.NET中所谓的委托(delegate),它就是函数的类型。与普通对象与类型不同,委托的对象(函数)可以不要new操作符号创建,因为函数已经存在于代码中。委托自己没有成员,它只是一类函数的代表而已,所以叫做delegate,也可翻译成代表。
举一个把函数作为参数调用的例子。
int fun2(int n)
{
int m = 0;for(int k = 1; k <= n; k++)
{
m += k * k;
}
return m
}
int fun3(int n)
{
int m = 0;
for(int k = 1; k <= n; k++)
{
m += k * k * k;
}
return m
}
函数fun2计算1到n的平方和,函数fun3计算1到n的立方和。它们的属性相同:返回int、参数int。于是定义这两个函数的类型——一个委托TSum如下。注意,TSum是类型(Type),其返回类型、参数类型与fun2、fun3相同。
public delegate int TSum(int n);
这样,就可以定义调用函数的函数output(),如:
void output(TSum sum)
{
MessageBox.Show(sum(10).ToString());
}
最后,用 output(fun2)、output(fun3),将显示10以内平方数和、立方数和。当然,如果完全按照面向对象方式,可以先创建两个TSum实例,然后调用,如:
TSum f2 = new TSum(fun2);
TSum f3 = new TSum(fun3);
output(f2);
output(f3);
后一种方式产生的f2、f3在内部机制上与output(fun2)、output(fun3)有较大的区别,详细阐述见Jeffrey Richter的名著《框架设计(第2版:CLR Via C#》。
.NET事件机制也可以理解:事件是函数、委托规定了函数的属性。在激发事件时,必须判断事件是否注册,即实现如下类似代码:
if(OnClickEvent != null) // 相当于判断 OnClickEvent 对象是否存在
{
OnClickEvent(this, new ClicktEventArgs(...));
}
刚接触.NET时,总觉得委托delegate难以理解,笔者认为关键原因是:没有从面向对象的观点上考虑函数与委托的关系,而是从传统的C/C++、函数指针、函数回调、调用安全、事件机制等方面讲委托。事实上,从面向对象的观点看,函数是实体,那么就可认为是对象,再抽象就成函数类型——委托了。这样想,许多原先模糊的观念就清晰多了。
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- ------事件与委托 (定义与用法) 事件与委托的区别 (委托是类型,事件是对象)
- 面向对象的委托和事件
- 判断对象类型是否是Array的js脚本函数
- JavaScript的函数与对象是一回事
- C#之控制台基础 函数的参数是一个函数,使用委托类型
- 真的理解面向对象思维
- java面向对象思维的理解
- Js是否是面向对象编程的深入理解
- 面向对象的思维
- 面向对象的思维
- 马上理解js中的函数为何是一个对象
- 如何理解JavaScript中函数是第一类对象
- JavaScript对象、函数的理解,$.ajaxsetup({complete:XX})中complete属性是一个函数。
- 面向对象组合方法——委托
- javascript面向对象和面向委托
- C#面向对象(五)委托
- Sqlserver 列转行
- 接口类型的传递(传参in接口)
- 一些CSS样式和js
- 在eclipse里如何设置手机模拟器
- 一种基于GPRS的广告牌远程控制系统的研制
- 用面向对象思维理解.NET委托:函数是对象、委托是函数对象的类型
- 利用edtftpj组件实现FTP文件的上传
- Visual Basic 6.0连接PostgreSQL8.3.3
- Adobe有些软件出现“遇到问题需要关闭”问题的解决办法
- webwork拦截器interceptor 之 ActionInvocation 意义(转载)
- 打造windows下的嵌入式开发工具(2):binutils-2.18
- setAttribute注意
- 创业经验谈(转自:ouravr.com)
- tomcat5.5与jdk1.4不兼容