[轉貼] C#的建構子(Constructor)

2012112909:59
出處:http://sener.pixnet.net/blog/post/26730522-c%23%E7%9A%84%E5%BB%BA%E6%A7%8B%E5%AD%90(constructor)

只要對OOP有基本的認識,應該對建構子(Constructor)都不陌生,
C#對於建構子有些有趣的用法(其他OOP語言應該也是有,只是風不熟不知道),
提供給大家做個參考。

一般使用建構子時,不外乎是要初始化物件,因此可能會有帶參數或不帶參數的建構子
通常的寫法如下:

class parent
{
    public parent() { _name = "baba";}
    public parent(int a) { _name = "baba"; _age = a; }
}
 

a1.png 

可是有些時候,物件在初始化時可能會需要帶不同的參數進去,
又有共通的部分(如上述範例的_name),
這時候並不需要將相同的初始化程式複製一次,只要用下面的方式即可。

class parent
{
    public parent() { _name = "baba"; }
    public parent(int a):this() { _age = a; }
}
 

結果是相同的。

a1.png

而執行的順序是,先執行冒號後面的建構子,再執行實際呼叫的建構子,如下範例:

class parent
{
    public parent() { _name = "baba"; _age=100; }
    public parent(int a):this() { _age = a; }
}
 

a2.png 

當然,熟悉這個技巧後,可以變化的方式就很多了。
(風喜歡稱做「繼承建構子」,因為C#的繼承也是使用冒號

冒號後方的建構子可以是不帶參數建構子也可以是帶不同參數建構子
如果class本身是繼承其他class的話,那也可以以:base()的方式去執行父class建構子
相同的規則就是,先執行冒號後方建構子,再執行呼叫的建構子本身。

後話,這一小技巧,或許對於許多高手來說是基本中的基本,
但風相信,許多只寫Web的工程師不要說C#,連OOP的概念應該都很薄弱,
畢竟M$在Web這塊的許多努力都是為了要讓大家可以更簡單的做一個網站,
元件拉一拉、補個幾行code(甚至不用),一個動態/資料庫Web Site就成型了,
OOP是什麼好像不是那麼重要!?

但風還是認為,當一個網站的規模大到一定的程度,
就不是元件拉一拉就可以應付的了,所以基礎還是很重要。
話雖這麼說,風也是半路出家的,正在努力學習中(汗)。