(1)公用建構函式
共公的建構函式是最為常見的形式,允許類被使用者執行個體化。
C#執行個體如下:
1class myClass
2{
3 //Public Constructor
4 public myClass(){};
5}
VB執行個體如下:
Class myClassClass myClass
{
public Sub new()sub new()
end sub
}
(2)私人建構函式
私人建構函式是一種特殊的執行個體建構函式,通常應用於只包含靜態成員的類中,這些類經常作為實用類使用。
如果類具有一個或多個私人建構函式而沒有公用建構函式,則不允許被其他類(嵌套類除外)建立該類的執行個體。例如:
class myClass
{
private myClass(){};
public static double e = 2.71828;
}
聲明空建構函式可阻止自動產生預設建構函式。注意,如果不對建構函式使用存取修飾詞,則在預設情況下它仍是私人建構函式。但是,通常顯示地使用private(私人)修飾符來清楚地表明該類不能被執行個體化。
當沒有執行個體欄位或執行個體方法或調用方法以獲得類的執行個體時,私人建構函式可用於阻止建立類的執行個體。
私人函數的另一個應用場合是在單件(Singleton)模式中,是該模式實現的關鍵。私人函數保證類的執行個體只能通過該類中的靜態方法實現,從而保證執行個體的唯一性。
有關單件模式的介紹,請參見:http://fineboy.cnblogs.com/archive/2005/08/11/212782.html
(3)保護建構函式
受保護的建構函式使類可以被子類執行個體化,在大多數場合無用。但如果希望類只能被工廠執行個體化時,就用到了這個特性。下面是類只能被工廠執行個體化的例子:
首先,我們使類的建構函式被聲明為受保護的建構函式,即除了類和子類,都不能訪問建構函式。
Using System;
Namespace Staticconstructor
{
public class myNewClass
{
protected myNewClass()
{
}
}
}
這樣就保證了不能直接執行個體化myNewClass,然後我們建立一個工廠,負責執行個體化這個類。
Using System;
Namespace Staticconstructor
{
public class myFactory
{
public myFactory ()
{
}
public myNewClass CreatemyNewClass()
{
return new myNewClass();
}
}
}
然而代碼無法通過編譯,因為myNewClass的建構函式是受保護的,無法被myFactory執行個體化。結果是其他類無法執行個體化myNewClass,myFactory也不能。
由於myNewClass的建構函式是受保護的,因此其子類可以執行個體化這個類。但我們不能將工廠類作為其子類,這樣會導致耦合性。同時我們也不希望讓類本身執行個體化自身,因為需要靜態方法。
為瞭解決這個矛盾,要用到內部類。我們在myFactory內部建立一個私人的myNewClass的子類,然後通過該子類獲得myNewClass的執行個體。
Using System;
Namespace Staticconstructor
{
public class myFactory
{
public myFactory ()
{
}
public myNewClass CreatemyNewClass()
{
return new mySubClass ();
}
private class mySubClass : myNewClass
{
public mySubClass():base()
}
}
}
當然,myFactory實際返回的mySubClass,而不是myNewClass,不過對客戶而言並無區別。
這種方法也有缺陷,如果定義一個myNewClass的子類,即可通過該子類實現其執行個體化,但這種方法在實際中已經夠用。
(4)靜態建構函式
靜態建構函式用於初始化類,在建立第一個執行個體或引用任何靜態成員之前,將自動調用靜態建構函式來初始化類。靜態建構函式的聲明方式如下:
Using System;
Namespace Staticconstructor
{
public class myNewClass
{
static myNewClass()
{
}
}
}
靜態建構函式既沒有修飾符,也沒有參數。它在建立第一個執行個體或引用任何靜態成員之前將被自動初始化類,無法直接調用靜態建構函式。
在程式中,使用者無法控制何時執行靜態建構函式。
靜態建構函式的典型用途是當類使用記錄檔時,將使用這種建構函式向記錄檔中寫入項。下面是靜態建構函式的使用樣本:
1using System;
2namespace StaticConstructor
3{
4 public class myClass
5 {
6 public myClass()
7 {
8 System.Console.WriteLine("New Instance Created");
9 }
10
11 static myClass()
12 {
13 System.Console.WriteLine("This is static constructor");
14 }
15
16 public static void Hello()
17 {
18 System.Console.WriteLine("Hello");
19 }
20
21 public static void Main()
22 {
23 myClass.Hello();
24 myClass ms = new myClass();
25 System.Console.WriteLine();
26 }
27 }
28}
29
30