代码之美~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让构造方法为属性赋值更灵活,如需转载请自行联系原博主。

目录
相关文章
|
Linux 编译器 C语言
深入理解Linux中的`as`命令:汇编器之旅
`as`命令是Linux下的GNU汇编器,用于将汇编语言源码(.s或.S)转化为机器码目标文件(.o)。它是GNU Binutils的一部分,在编译流程中扮演重要角色,尤其在底层编程和硬件交互时。基本用法是`as -o outputfile inputfile`。选项如`-g`添加调试信息,`-I`指定包含文件路径。通常与编译器如`gcc`配合使用,提供对计算机工作原理和操作系统底层的深入理解。学习汇编语言能增强编程和系统理解能力。
|
机器学习/深度学习 自然语言处理 算法
一个中心+三大原则 -- 阿里巴巴小蜜这样做智能对话开发平台
        在阿里巴巴智能服务事业部的X蜂会上,小蜜北京团队的高级算法专家李永彬(水德)分享了小蜜智能对话开发平台的构建,围绕平台来源、设计理念、核心技术、业务落地情况四大维度讲述了一个较为完整的智能任务型对话开发平台的全景。
5543 1
|
索引
什么是RFC?
RFC及RFC编辑者:    RFC(Request For Comments)-意即“请求注解”,包含了关于Internet的几乎所有重要的文字资料。如果你想成为网络方面的专家,那么RFC无疑是最重要也是 最经常需要用到的资料之一,所以RFC享有网络知识圣经之美誉。
2465 0
|
机器学习/深度学习 编解码 算法
openCV 第四篇 角点检测、图像特征、图片拼接
openCV 第四篇 角点检测、图像特征、图片拼接
openCV 第四篇 角点检测、图像特征、图片拼接
|
机器学习/深度学习 人工智能 编解码
【DSW Gallery】基于EasyNLP-Diffusion模型的中文文图生成
EasyNLP提供多种模型的训练及预测功能,旨在帮助自然语言开发者方便快捷地构建模型并应用于生产。本文简要介绍文图生成的技术,以及如何在PAI-DSW中基于EasyNLP使用diffusion model进行finetune和预测评估。
【DSW Gallery】基于EasyNLP-Diffusion模型的中文文图生成
|
安全 Shell Linux
靶机实战-vuluhub系列-Hack djinn:1 : walkthrough
靶机实战-vuluhub系列-Hack djinn:1 : walkthrough
靶机实战-vuluhub系列-Hack djinn:1 : walkthrough
|
机器学习/深度学习 数据挖掘 测试技术
新视觉任务!CVPR 2021 Oral | OWOD:面向开放世界的目标检测
我们的实验评估和研究分析了ORE在实现开放世界目标方面的功效。作为有趣的by-product,我们发现识别和表征未知实例有助于减少增量目标检测设置中的混乱,在此方法中,我们无需任何方法上的努力即可获得最先进的性能。我们希望我们的工作将吸引对这个新发现的但至关重要的研究方向的进一步研究。
新视觉任务!CVPR 2021 Oral | OWOD:面向开放世界的目标检测
|
前端开发 容器
巧妙实现带圆角的渐变边框
巧妙实现带圆角的渐变边框
646 0
巧妙实现带圆角的渐变边框
|
SQL 存储 Oracle
MySQL: 与only_full_group_by模式不兼容的两个解决办法
MySQL: 与only_full_group_by模式不兼容的两个解决办法
MySQL: 与only_full_group_by模式不兼容的两个解决办法
|
存储 Kubernetes 安全
K8S原理剖析:安全原理剖析和实践
K8S原理剖析:安全原理剖析和实践
K8S原理剖析:安全原理剖析和实践