在一個類中如果需要實現多個自定義構造函數,通常做法是在構造函數中實現各自的業務邏輯,如果這些業務邏輯的實現並非截然不同的話,顯然不符合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關鍵字把傳入的參數轉發給主構造函數,並且提供必須的其它參數,這樣子,我們整個類中需要我們操心的就是那個主構造函數了,其余構造函數基本上可以為空。
(注意:如果構造函數鏈中還有實現各自的邏輯,那麼實際上是先執行主構造函數的代碼,再執行各自邏輯),使用這種做法,真正的工作都交給了一個構造函數,類定義就會更簡潔、更易維護、簡化了編程任務。