VB.NET構造函數實際處理方式簡介
在開發領域,已經出現了許多種開發語言供編程人員隨自己的需求進行選擇應用。比如VB.NET語言就可以對有特定需求的開發人員進行一定的幫助。VB.NET構造函數進行處理的時侯,有兩個陳述值得注意: #t#
(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
這一點非常重要而且也很有意義。因為我們往往傾向于認為子類繼承了基類所有的屬性和方法,這往往導致我們的程序出現編譯錯誤。
綜合以上兩個陳述,在實際編程中應遵循一個原則:在類中,無論是基類還是子類,顯式地聲明所有需要的無參數或帶參數構造函數。遵循這個原則,既有利于提高編譯正確代碼的速度,也有利于自己和其他程序員理解代碼。