代码之美~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,呵呵。辛苦了。