C#允许一个类不去手动声明一个构造方法,因为.net内部为我们继承了它,它为自己为我们生成一个无参的架造方法,本文中我们讲的架造方法都属于实例构造方法,下面我们来说明几个问题:
1 构造方法在何时执行
2 基类的构造方法应该去子类考虑的多一些
首先我们来说一下第一个问题,构造方法的执行时期,当类对象被new时,它会首先执行符合它(类)方法签名的构造方法,如这个语句
Person person=new Person();
这是我们经常看到的建立对象的语句,它事实上是去执行Person类型的public Person()这个方法的,当然,如果语句变成了
Person person=new Person("zzl","male");
那么,它要被执行的构造方法就变成了public Person(string name,string gander);
而这两个方法的不同点就是方法签名上,方法2允许在建立对象时同时指定对象的两个属性,而方法1则另外再对属性赋值,很显然方法2对象程序员来说,更友好。
OK,下面我们再来说一下”基类的构造方法应该去子类考虑的多一些”这个话题,其实在我上一讲中已经把代码粘贴上了,大家应该已经注意到了。
考虑的多一些,这个意思是说,尽量让子类可以更清晰,更简洁的去使用基类的属性和方法等,在很多情况下,基类会向子类公开一些属性,而这些属性的创建很多时候是由子类决定的,所以基类应该保留友好的赋值接口。
下面代码请看:
/// <summary> 7 /// 数据访问对象(只对子类可见) 8 /// </summary> 9 protected DataContext DB; 10 11 #region Constructors 12 public DataBase() 13 : this(new LINQ.DataClasses1DataContext(System.Configuration.ConfigurationManager.ConnectionStrings["XXB"].ToString())) 14 { } 15 public DataBase(DataContext db) 16 : this(() => { return db; }) 17 { } 18 public DataBase(Func<DataContext> func) 19 { 20 this.DB = func(); 21 } 22 #endregion
事实上,它就是上一讲的代码片断,它向子类公开的DB这个属性,而DB的创建于子类决定,所以在基类构造方法中有3个重载,它在不同时候对子类有不同的使用,如
public DataBase(Func<DataContext> func),它允许子类为基类传递一个Func委托人方法,这使得程序的灵活度提高了不少。