在一個類中如果需要實現多個自定義構造函數,通常做法是在構造函數中實現各自的業務邏輯,如果這些業務邏輯的實現並非截然不同的話,顯然不符合oop編程思想,極不利於維護,當然,我們也可以通過將相同的邏輯部分封裝成一個方法,但還有一種更為合理簡單的方法,下面就通過this關鍵字來實現串聯構造函數做一簡單示例。
示例代碼如下:
1 public class Person
2 {
3 public string personName;
4 //定義年齡為可空類型,這樣就可以賦予其null值
5 public int? personAge;
6
7 //下面前三個構造函數都是去調用參數最多的第四個構造函數,只取它們所需要的部分參數即可
8 //這樣的做法就是this串聯構造函數
9 public Person():this("",0)
10 {
11
12 }
13
14 public Person(string name):this("evan",null)
15 {
16
17 }
18
19 public Person(int age):this("",20)
20 {
21
22 }
23
24 public Person(string name, int? age)
25 {
26 this.personName = name;
27 //通過 ?? 判斷傳入的age是否null值
28 //如果屬於null值,則賦值100
29 this.personAge = age ?? 100;
30 }
31
32 public void Display()
33 {
34 Console.WriteLine("Name:{0},Age:{1}\n", personName, personAge);
35 }
36 }
主函數調用如下:
1 static void Main(string[] args)
2 {
3 Person per1 = new Person();
4 per1.Display();
5
6 Person per2 = new Person(20);
7 per2.Display();
8
9 Person per3 = new Person("evan");
10 per3.Display();
11
12 Person per4 = new Person("evan", 20);
13 per4.Display();
14
15 Console.ReadLine();
16 }
這樣的做法就是讓一個接受參數最多的構造函數做"主構造函數", 且在主構造函數中實現必須的業務邏輯,其余的構造函數只要使用this關鍵字把傳入的參數轉發給主構造函數,並且提供必須的其它參數,這樣子,我們整個類中需要我們操心的就是那個主構造函數了,其余構造函數基本上可以為空。
(注意:如果構造函數鏈中還有實現各自的邏輯,那麼實際上是先執行主構造函數的代碼,再執行各自邏輯),使用這種做法,真正的工作都交給了一個構造函數,類定義就會更簡潔、更易維護、簡化了編程任務。