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

  • 相关阅读:
    GMap.NET开发技巧 开发可以根据地图放大缩小而缩放的图元
    GPS定位数据库表设计
    基于WCF回调(WCF Callback)的GPS报警推送(带源码)
    基于部标JT/T 808协议及数据格式的GPS服务器 开发
    如何做好GPS平台软硬件集成测试
    框架内思维 创新更有力
    JT/T 808 809 部标认证流程和申报材料下载
    基于部标JT/T8092011的(已过检)GPS平台数据交换及转发服务器
    基于Spring.NET的MVC应用程序发布时的虚拟路径错误的解决方案
    javascript组件开发方式(转载)
  • 原文地址:https://www.cnblogs.com/lori/p/2595440.html
Copyright © 2020-2023  润新知