Visual Basic 6.0 使用者可以進行的 Class_Initialize 變更
更新:2007 年 11 月
建構函式 (Constructor) 是建立物件時所執行的方法。建構函式為 Visual Basic 的新增項目,不僅結合了 Visual Basic 6.0 的 New 陳述式 (Statement) 和 Class_Initialize 方法,還可在建立類別 (Class) 執行個體時,提供更多的彈性和控制。如需物件建立的詳細資訊,請參閱建立和使用物件。
Class_Initialize
Visual Basic 6.0
Visual Basic 6.0 會透過 Class_Initialize 方法,提供建構函式概念支援。這是私用 (Private) 方法,而且不允許使用任何參數。當建立類別的新執行個體時,就會自動呼叫這個方法。如果呼叫 New 關鍵字,就會呼叫 Class_Initialize 方法 (如果該方法存在的話)。
假設您要指定預設為五年的年度成長樹狀目錄。類別程式碼看起來可能如下:
' Visual Basic 6.0
Private mvarYearlyGrowth As Integer
Public Property Get YearlyGrowth() As Integer
YearlyGrowth = mvarYearlyGrowth
End Property
Public Property Let YearlyGrowth(ByVal newValue As Integer)
mvarYearlyGrowth = newValue
End Property
Private Sub Class_Initialize()
mvarHeight = 5
End Sub
用以建立樹狀目錄和設定屬性的程式碼如下所示:
Dim growingTree As New Tree
growingTree.YearlyGrowth = 10
Visual Basic 2008
Visual Basic 2008 支援透過 New 關鍵字使用建構函式。 在這個情況中,不需要其他程式碼即可設定 YearlyGrowth 屬性。呼叫 New 關鍵字時會呼叫類別中的其中一個多載的 New 方法。如果類別中沒有任何 New 方法,編譯器 (Compiler) 就會建立不含任何參數的方法。
Option Strict On
Public Class Tree
Private yearlyGrowthValue As Integer = 5
Public Property YearlyGrowth() As Integer
Get
Return yearlyGrowthValue
End Get
Set(ByVal Value As Integer)
yearlyGrowthValue = Value
End Set
End Property
Public Sub New(ByVal newYearlyGrowth As Integer)
Me.YearlyGrowth = newYearlyGrowth
End Sub
End Class
用以建立樹狀目錄和設定屬性的程式碼如下所示:
Dim growingTree As New Tree(10)
在這個範例中,您無法在不指定年度成長的情況下就建立 Tree。若要這麼做,您可以在沒有任何參數的類別中,加入其他 New 方法。這就是所謂的「多載化」(Overloading) 建構函式。
New 關鍵字
Visual Basic 6.0
在 Visual Basic 6.0 中,通常不建議使用這行程式碼:
Dim growingTree As New Tree
這是因為每次存取 growingTree 變數時,編譯器都會檢查其值是否為 Nothing。如果是,便會建立新的執行個體,並將它指派給 growingTree。這樣做不僅沒有效率,也會造成程式設計錯誤。
Visual Basic 2008
在 Visual Basic 2008 中,不會檢查執行個體,也不會建立任何新執行個體。建立新執行個體的唯一方法,便是執行一行包含 New 或 As New 關鍵字的程式碼。事實上,上面這一行程式碼是目前建議用來建立新執行個體的方法。
升級建議
升級精靈會將 Class_Initialize 方法升級為:
'UPGRADE_NOTE: Class_Initialize was upgraded to Class_Initialize_Renamed. Click for more: ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"'
Private mvarHeight As Short
Private Sub Class_Initialize_Renamed()
mvarHeight = 0
End Sub
Public Sub New()
MyBase.New()
Class_Initialize_Renamed()
End Sub
您可以刪除 Class_Initialize_Renamed 呼叫,並直接將程式碼移入建構函式。由於這樣做可刪除程序所不需要的呼叫,並讓其他人能更容易閱讀您的程式碼。如果每次呼叫 New 時,經常需要接著一組特定屬性,請考慮加入建構函式來設定這些屬性。Visual Basic 6.0 程式碼可以由 Visual Basic 2008 中的這個程式碼取代:
Public Sub New(ByVal newYearlyGrowth As Integer)
Me.YearlyGrowth = newYearlyGrowth
End Sub