代码之美:强大的构造方法重载

上一篇 / 下一篇  2012-07-11 09:55:20 / 个人分类:杂谈

aL?i5};q,yT0  一直在看“代码之丑”这个文章系列,心想,为得不来个“代码之美”呢,呵呵,今天做项目时,认为我的验证方法代码逻辑比较漂亮,所以就摘出来分享一下吧,今天讲的是方法的重载,事实上主要是说一下构造方法的重载。51Testing软件测试网j[xfVJ\ M/a

51Testing软件测试网w ?(Umh8S"\#i

  构造方法不同于其它方法,它没有返回值,51Testing软件测试网Z"J)|5~ [8W`;z,y/x

dZ+_.]\M0  ● 可以有参数列表,51Testing软件测试网0mk8nV_ k

%A.lT/p(ClN _0  ● 可以是public,private,protected,internal等去修饰它,

D-io{;Q R&\}\051Testing软件测试网Sm%oA!Z,eiY

  ● 可以是加了static的类型构造方法,也可以是一个实例构造方法,

8Z'oL*N He0n051Testing软件测试网 [c3Iy U9na*q-|

  ● 可以自己去重载自己的构造方法

Qv(N"a.k5I0

1~M@_ W!Ne:jY0  ● 可以去重载基类的构造方法

f*Nh2eh&zvi0

"?gp el"K$c#UZ0  美1:重载自己

c%mmy%Iz$C8c0
  1. /// <summary> 
  2.         /// 代参数的 
  3.         /// </summary> 
  4.         /// <param name="userID"></param> 
  5.         /// <param name="userName"></param> 
  6.         public User_Info(int userID, string userName)  
  7.         {  
  8.             this.UserID = UserID;  
  9.             this.UserName = UserName;  
  10.         }  
  11.         /// <summary> 
  12.         /// 不代参数,但可以为其它构造方法传参数值的 
  13.         /// </summary> 
  14.         public User_Info() : this(1"test") { }
51Testing软件测试网q3?bY8eH%h+a_"y

  美2:重载基类,这在我们的面向对象的程序开发中用的是最多的

rE$ueDL0
  1. [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]  
  2.     public class EmailAttribute : EntityValidationAttribute  
  3.     {  
  4.         /// <summary> 
  5.         /// 返回指定格式的错误 
  6.         /// </summary> 
  7.         /// <param name="messageType"></param> 
  8.         /// <param name="args"></param> 
  9.         public EmailAttribute(MessageType messageType, params object[] args) :  
  10.             base(messageType, args) { }  
  11. 51Testing软件测试网W4S.WtwuIj
  12.         /// <summary> 
  13.         /// 自定义的错误 
  14.         /// </summary> 
  15.         /// <param name="errMessage">错误说明</param> 
  16.         public EmailAttribute(string errMessage)  
  17.             : base(errMessage) { }

\I8F Kh0  这是选自我验证组件的一段代码,它很好的体现了对基类构造方法的重载。51Testing软件测试网__P \({?

+ds'Q8|&i[B I3W0  看下面的代码也属于这种情况

m9X(r%q:D$iD0

+GR w&x`l9k6z?5g051Testing软件测试网;L?UYx~

  1. /// <summary> 
  2.      /// 通用验证基类 
  3.      /// </summary> 
  4.      public abstract class EntityValidationAttribute : ValidationAttribute  
  5.      {  
  6.          #region Constructors  
  7.          /// <summary> 
  8.          /// 定义系统某种规则的错误消息 
  9.          /// </summary> 
  10.          /// <param name="messageId"></param> 
  11.          /// <param name="args"></param> 
  12.          public EntityValidationAttribute(MessageType messageId, params object[] args) :  
  13.              base(() => MessageManager.Current.GetMessage(messageId, args)) { }  
  14.    
  15.          /// <summary> 
  16.          /// 支持自定义的错误消息 
  17.          /// </summary> 
  18.          /// <param name="errMessage"></param> 
  19.          public EntityValidationAttribute(string errMessage) : base(errMessage) { }  
  20.          #endregion
51Testing软件测试网9oc^;E k`

  它的基类ValidationAttribute的构造方法会接受一个Func<string>的委托,意思是说,子类可以根据自己的需要为它传递一个方法,但返回值必须是string类型,而上面的写法

_:ij}J;tY0

3C&E r:Yk0

h~)svR`(K0
() => MessageManager.Current.GetMessage(messageId, args)
51Testing软件测试网 J+Op1c!Y-W!Q

  它是指一个匿名方法,也是符合基类的Func的方法签名的,即“无参数”,它所回调的方法是GetMessage,它有两个参数,由子类在实例化时提供的。

$N tK w5p\0

'{ XM|"uz$R0  ValidationAttribute这个类是System.ComponentModel.DataAnnotations下的验证功能的 基类,我们在继承它的时候,为它的传递string变量或者Func<string>的委托,它都会将返回值赋值ErrorMessage这 个属性,它在外界就可以被访问到的。51Testing软件测试网 W k K'v#okH!Y

51Testing软件测试网 P3H&H fD,a&D


TAG:

 

评分:0

我来说两句

Open Toolbar