委托示例(1)
2013-11-24 21:12
239 查看
可以把委托视为“方法”的类型,这样就可以把方法作为参数来传递了。什么时候需要使用委托?下面来例举一个例子说明。
假设我们需要对许多文本框设置属性:
比如我们要设置前景色、背景色,普通的编码会是这样的:
设置前景色:
设置背景色
发现什么问题没有,大体的逻辑都是一样的,都是使用了foreach循环,就是foreach循环里面的代码不一样。那么能不能想个办法,把foreach循环通用?
下面我们定义一个委托:
然后定义一个设置与颜色相关的通用方法
注意:参数setColor是一个方法。这样foreach循环就通用了,那具体该这么用呢?
设置前景色
设置背景色
而具体设置前景色和背景色的方法是这样的:
这样用了委托有以下好处:
1 通用了同样的逻辑块foreach循环;
2 由于具体方法从具体的逻辑块中剥离了,是独立的方法,一样可以重复使用。
同样,我们可以把属性为int类型,枚举类型的方法用委托抽象出来,试一下吧!
假设我们需要对许多文本框设置属性:
比如我们要设置前景色、背景色,普通的编码会是这样的:
设置前景色:
if (colorDialog.ShowDialog() == DialogResult.OK) { foreach (Control temp in FlpControls.Controls) { temp.ForeColor = colorDialog.Color; } }
设置背景色
if (colorDialog.ShowDialog() == DialogResult.OK) { foreach (Control temp in FlpControls.Controls) { temp.BackColor = colorDialog.Color; } }
发现什么问题没有,大体的逻辑都是一样的,都是使用了foreach循环,就是foreach循环里面的代码不一样。那么能不能想个办法,把foreach循环通用?
下面我们定义一个委托:
/// <summary> /// 设置控件颜色属性相关的委托 /// </summary> /// <param name="ctl">控件</param> /// <param name="property">颜色</param> public delegate void DelegateSetControlColor(Control ctl,Color property);
然后定义一个设置与颜色相关的通用方法
/// <summary> /// 设置控件属性 /// </summary> /// <param name="flp">存放文本框控件的控件</param> /// <param name="setColor">定义控件颜色的相关委托</param> /// <param name="propervalue">相关的颜色</param> public static void SetProperties(FlowLayoutPanel flp, DelegateSetControlColor setColor, Color propervalue) { foreach (Control temp in flp.Controls) { setColor(temp, propervalue); } }
注意:参数setColor是一个方法。这样foreach循环就通用了,那具体该这么用呢?
设置前景色
if (colorDialog.ShowDialog() == DialogResult.OK) { //SetControlForeColor是设置前景色的具体方法 SetControlProperties.SetProperties(FlpControls, SetControlForeColor, colorDialog.Color); }
设置背景色
if (colorDialog.ShowDialog() == DialogResult.OK) { //SetControlBackColor是设置背景色的具体方法 SetControlProperties.SetProperties(FlpControls, SetControlBackColor, colorDialog.Color); }
而具体设置前景色和背景色的方法是这样的:
#region 设置与控件颜色相关的具体方法 /// <summary> /// 设置背景色 /// </summary> /// <param name="ctl">控件</param> /// <param name="color">背景色</param> public static void SetControlBackColor(Control ctl, Color color) { ctl.BackColor = color; } /// <summary> /// 设置前景色 /// </summary> /// <param name="ctl">控件</param> /// <param name="color">前景色</param> public static void SetControlForeColor(Control ctl, Color color) { ctl.ForeColor = color; } #endregion
这样用了委托有以下好处:
1 通用了同样的逻辑块foreach循环;
2 由于具体方法从具体的逻辑块中剥离了,是独立的方法,一样可以重复使用。
同样,我们可以把属性为int类型,枚举类型的方法用委托抽象出来,试一下吧!
相关文章推荐
- 软件工程视频(前四章小结-图)
- 迷惘
- linux下SVN服务搭建:apache+svn+usvn+php+mysql
- 文件输入输出操作
- 什么时候该用utf-8,什么时候用utf8
- Opencv2系列学习笔记4(灰度直方图)
- Mysql 创建,授权,删除,修改用户
- [Android开发实战]金山清理大师(猎豹清理大师)一键加速快捷方式动画实现
- 【Cocos2d-x】Win7+ vs2012,2010 + Cocos2d-x2.2 配置Cocos2d-X项目-环境
- ultraMaGE 分析二 消息响应
- COCOS2D-X 2.1.3没有CCListView,被CCTableView代替了
- 初学C语言者适合做的练习
- The 2013 ACM-ICPC Asia Changsha Regional Contest(2013区域赛练习)
- 定义Person(人)类,由Person分别派生出Teacher(教师)类和Cadre(干部)类,再由Teacher(教师)类和Cadre(干部)类采用多重继承方式派生出新类TeacherCadre(
- MySQL安装图解
- Codeforces Round #213 (Div. 2) B. The Fibonacci Segment
- Linux防火墙的配置
- Yii技术框架学习之路(三)
- 如何让自己桌面文件默认路径在其它盘呢?
- 编写设计一个People(人)类。该类的数据成员有年龄(age)、身高(height)、体重(weight)和人数(num),其中人数为静态数据成员,成员函数有构造函数(People)、进食(Eatt