在VB.NET中處理建構函式時,有兩個陳述值得注意:
(1) 如果類型不包含任何執行個體建構函式聲明,則VB.NET提供預設的建構函式;
預設參數調用直接基類的無參數建構函式。如果基類沒有可訪問的無參數建構函式,則發生編譯期錯誤。
(2) 建構函式不能繼承;
陳述(1)包含兩個方面的資訊:①是如果類型不包含任何執行個體建構函式聲明,則VB.NET提供預設的建構函式,即下面的聲明是允許的,在類Shape中我們沒有顯式聲明任何建構函式,但是我們仍然可以通過VB.NET自動提供的無參數建構函式New()來執行個體化類;
Module TestModule Test
Public Sub Main()Sub Main()
Dim shape1 As Shape = New Shape
End Sub
End Module
Public Class ShapeClass Shape
Public Sub Draw()Sub Draw()
'some codes here.
End Sub
End Class
②是如果類型中包含有執行個體建構函式的聲明,那麼VB.NET不再提供預設的建構函式,例如,我們在類Shape中添加了一個帶參數的建構函式,
Public Class ShapeClass Shape
Private _pt As Point
Public Sub New()Sub New(p As Point)
_pt = p
End Sub
Public Sub Draw()Sub Draw()
'some codes here.
End Sub
End Class
那麼,如果直接執行個體化類時,則會產生錯誤;
Dim shape1 As Shape = New Shape
只能通過調用Shape類中顯式聲明的帶參數的建構函式來執行個體化類,如下,
Dim shape1 As Shape = New Shape(New Point(0, 0))
因此,如果要在類中同時使用無參數和帶參數的建構函式,必須同時顯式地聲明兩種建構函式。
Public Class ShapeClass Shape
Private _pt As Point
Public Sub New()Sub New()
'some codes here.
End Sub
Public Sub New()Sub New(p As Point)
_pt = p
End Sub
Public Sub Draw()Sub Draw()
'some codes here.
End Sub
End Class
陳述(2),建構函式不能繼承,即,如果要使子類與基類有相同的建構函式,那麼必須在每個子類中都顯式的聲明與基類構造相同的建構函式,例如:
Public MustInherit Class ShapeClass Shape
Private _pt As Point
Public Sub New()Sub New()
'some codes here.
End Sub
Public Sub New()Sub New(p As Point)
_pt = p
End Sub
Public MustOverride Sub Draw()Sub Draw()
End Class
Public Class LineClass Line
Inherits Shape
Public Sub New()Sub New()
End Sub
Public Sub New()Sub New(p As Point)
MyBase.New(p)
End Sub
Public Overrides Sub Draw()Sub Draw()
'some codes here.
End Sub
End Class
這一點非常重要而且也很有意義。因為我們往往傾向於認為子類繼承了基類所有的屬性和方法,這往往導致我們的程式出現編譯錯誤。
綜合以上兩個陳述,在實際編程中應遵循一個原則:在類中,無論是基類還是子類,顯式地聲明所有需要的無參數或帶參數建構函式。遵循這個原則,既有利於提高編譯正確代碼的速度,也有利於自己和其他程式員理解代碼。