代码之美~Func让构造方法为属性赋值更灵活

简介:

有时我们习惯上把基类中属性的赋值权限放在它的构造方法上,这样给我们感觉更直接,也更安全,这也体现了面向对象的封装性,即将不想开放的东西隐藏到类内部,当进行.net3.5时代后,属性的定义显得更加美观和合理,看下面是几种具有不同读写权限的属性。

 1         /// <summary>
 2         /// 完全公开
 3         /// </summary>
 4         public string ErrorMessage { get; set; }
 5         /// <summary>
 6         /// 读完全公开,但写操作约束在了子类
 7         /// </summary>
 8         public string ErrorMessage { get; protected set; }
 9         /// <summary>
10         /// 读完全公开,但写操作只能在本类中进行
11         /// </summary>
12         public string ErrorMessage { get; private set; }
13         /// <summary>
14         /// 只读属性,只能返回消息,不能赋值
15         /// </summary>
16         public string ErrorMessage { get; }

上面的知识只是为本文做一个铺垫,本文主要说在构造方法中使用Func委托,让属性赋值更灵活。更多Func的资料请看我的这篇文章

实例说明:一个人类,一个中国人类,在中国人类中有个显示姓名的属性,它由构造方法为它赋值,而对于中国人和美国人她们姓名的组成是不一样的,所以将公用的东西提取到一个基类

Person中,而中国人相关的东西放在ChinaPeople中,它根据有自己的构造方法,可以有自己产生姓名的方式,男人一种,女人一种,这可以根据一个Gander枚举来实现切换。

Person代码如下:

 1   public abstract class Person
 2     {
 3         #region Fields
 4         private string _errorMessage;
 5         private Func<string> _func;
 6         #endregion
 7 
 8         #region Constructors
 9 
10         protected Person()
11         { }
12 
13         protected Person(Func<string> displayNameAccessor)
14         {
15             this._func = displayNameAccessor;
16         }
17 
18         protected Person(string displayName)
19             : this(() => displayName)
20         { }
21         #endregion
22 
23         #region Methods & Properies
24         public string DisplayName
25         {
26             get
27             {
28                 return this._func();
29             }
30         }
31         #endregion
32     }

 而对于中国人来说,他们完全可以根据自己国家的标准和风俗去规定自己的姓名显示方法,如张三先生,李四小姐等,所以ChinaPerson类的内容如下:

 1   public class ChinaPerson : Person
 2     {
 3         public ChinaPerson(string name, Gander gander)
 4             : base(() => FormatName(name, gander))
 5         { }
 6         public ChinaPerson(string name)
 7             : base(name)
 8         { }
 9         public ChinaPerson()
10         { }
11         /// <summary>
12         /// 中国人类型,格式姓名
13         /// </summary>
14         /// <param name="name"></param>
15         /// <param name="gander"></param>
16         /// <returns></returns>
17         public static string FormatName(string name, Gander gander)
18         {
19             string res = null;
20             switch (gander)
21             {
22                 case Gander.Male:
23                     res = string.Format("中国人姓名是:{0}先生", name);
24                     break;
25                 case Gander.FeMale:
26                     string.Format("中国人姓名是:{0}女士", name);
27                     break;
28             }
29             return res;
30         }
31     }

调用时,代码如下:

1             ChinaPerson cm = new ChinaPerson("张三", Gander.Male);
2             Console.WriteLine(cm.DisplayName);
3 
4             cm = new ChinaPerson("张三");
5             Console.WriteLine(cm.DisplayName);

结果为:

而在调用它的时间,就像我们需要的方式显示了,直接输入姓名就显示姓名,如果输入的是姓名和性别,就会根据性别的类型,去调用它的模板,这一切都是灵活使用Func委托的功劳,

在此,感谢一下Func,呵呵。辛苦了。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:代码之美~Func让构造方法为属性赋值更灵活,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
网络协议 网络安全 网络虚拟化
路由器详细讲解
路由器是连接不同网络并转发数据包的关键设备,工作在OSI模型第三层(网络层)。它通过路由表选择最佳路径,支持数据转发、NAT转换、防火墙保护等功能。路由器分为家用、商用和工业级,各有针对性的性能与功能。其配置包括硬件连接、登录管理界面及网络、无线、安全等设置,选购时需关注处理能力、无线速率、端口速率和功能需求等关键指标。
990 22
|
11月前
|
机器学习/深度学习 关系型数据库 MySQL
mysql bit对gorm使用何种类型?
在GORM中使用MySQL的BIT类型时,通常使用 `bool`类型来处理BIT(1),使用 `[]byte`类型来处理BIT(N)(N > 1)。通过正确的类型映射和位操作,可以高效地处理位字段数据。确保在定义结构体字段时,明确指定字段类型,以便GORM能够正确地处理数据库交互。
257 18
|
12月前
|
机器学习/深度学习 算法 Python
基于BP神经网络的金融序列预测matlab仿真
本项目基于BP神经网络实现金融序列预测,使用MATLAB2022A版本进行开发与测试。通过构建多层前馈神经网络模型,利用历史金融数据训练模型,实现对未来金融时间序列如股票价格、汇率等的预测,并展示了预测误差及训练曲线。
212 12
|
12月前
|
运维 监控 BI
zabbix强大的报警系统
zabbix强大的报警系统
413 8
|
存储 SQL 关系型数据库
MySQL存储引擎
本文介绍了数据库优化的多个方面,包括选择合适的存储引擎、字段定义原则、避免使用外键和触发器、大文件存储策略、表拆分及字段冗余处理等。强调了从业务层面进行优化的重要性,如通过活动设计减少外部接口调用,以及在高并发场景下的流量控制与预处理措施。文章还提供了具体的SQL优化技巧和表结构优化建议,旨在提高数据库性能和可维护性。
374 1
MySQL存储引擎
|
人工智能 小程序
【一步步开发AI运动小程序】七、进行运动计时、计数
随着AI技术的发展,阿里体育推出的“乐动力”、“天天跳绳”等APP,使云上运动会、AI体育指导等概念备受关注。本文将引导您从零开始,利用“云智AI运动识别小程序插件”,在小程序中实现类似功能。通过插件的`sports`和`calc`命名空间,可轻松实现运动检测、计时计数等功能。示例代码展示了如何创建并使用俯卧撑运动分析器,以及如何通过摄像头捕获图像进行人体识别和运动分析。敬请期待后续关于姿态分析的内容。
|
人工智能 大数据 区块链
|
数据可视化 数据挖掘 定位技术
Python中利用Bokeh创建动态数据可视化
【10月更文挑战第14天】本文介绍了如何使用 Bokeh 库在 Python 中创建动态数据可视化。Bokeh 是一个强大的开源可视化工具,支持交互式图表和大规模数据集的可视化。文章从安装 Bokeh 开始,逐步讲解了如何创建动态折线图,并添加了交互式控件如按钮、滑块和下拉菜单,以实现数据更新频率的调节和颜色选择。通过这些示例,读者可以掌握 Bokeh 的基本用法,进一步探索其丰富功能,创建更具吸引力和实用性的动态数据可视化。
|
机器学习/深度学习 人工智能 分布式计算
【机器学习】协方差和相关性有什么区别?
【5月更文挑战第17天】【机器学习】协方差和相关性有什么区别?
|
机器学习/深度学习 存储 自然语言处理
【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取
什么是基于深度学习的文本信息抽取? **信息抽取 (Information Extraction)** 是把原始数据中包含的信息进行结构化处理,变成表格一样的组织形式。输入信息抽取系统的是原始数据,输出的是固定格式的信息点,即从原始数据当中抽取有用的信息。信息抽取的主要任务是将各种各样的信息点从原始数据中抽取出来。然后以统一的形式集成在一起,方便后序的检索和比较。由于能从自然语言中抽取出信息框架和用户感兴趣的事实信息,无论是在信息检索、问答系统还是在情感分析、文本挖掘中,信息抽取都有广泛应用。随着深度学习在自然语言处理领域的很多方向取得了巨大成功......
【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取

热门文章

最新文章