你的假設是錯誤的;您的派生類的構造函數可以具有任何簽名,只要他們使用MyBase.New正確調用其基類的構造函數之一即可。這裏有一個完整的例子:
Imports System
Public Class MainClass
Shared Sub Main()
Dim w As New Window(5, 10)
w.DrawWindow()
Dim lb As New ListBox(20, 30, "Hello world")
lb.DrawWindow()
End Sub
End Class
Public Class Window
Public Sub New(ByVal top As Integer, ByVal left As Integer)
Me.top = top
Me.left = left
End Sub 'New
Public Sub DrawWindow()
Console.WriteLine("Drawing Window at {0}, {1}", top, left)
End Sub
Private top As Integer
Private left As Integer
End Class
Public Class ListBox
Inherits Window
Public Sub New(ByVal top As Integer, ByVal left As Integer, ByVal theContents As String)
MyBase.New(top, left) '
mListBoxContents = theContents
End Sub
Public Shadows Sub DrawWindow()
MyBase.DrawWindow()
Console.WriteLine("Writing string to the listbox: {0}", mListBoxContents)
End Sub
Private mListBoxContents As String
End Class
編輯:你沒有被強制保留或所有擴展基類的構造函數的簽名。這是有效的,例如:
Public Class ListBox
Inherits Window
Public Sub New(ByVal theContents As String)
MyBase.New(20, 30) '
mListBoxContents = theContents
End Sub
'More code
End Class
剛剛看到您的編輯。你不能那樣做;假設基類有一些從構造函數參數初始化的狀態。在創建派生類對象時,如果不調用基類構造函數,編譯器如何知道如何初始化從基類繼承的狀態?就像@ PhonicUK所說的,如果你的抽象類沒有狀態(沒有字段),那麼作爲一個接口會更好。 –
爲了澄清這個問題:這不是詢問基礎構造函數是否可以避免被調用,而是詢問該調用是否可以是*隱式的* - 不必編寫簡單調用通過基類的代碼。恕我直言,雖然不得不這樣做偶爾是不方便的,但編譯器不會嘗試自動生成此代碼是很好的:如果允許此語法,那麼讀取MyDerived文本的人將不知道構造函數是否存在 - 必須尋找基地。另外,如果第二個構造函數被添加到'MyBase'中,則不能控制'MyDerived'中允許哪個構造函數。 – ToolmakerSteve
...這是一個*代碼編輯便利的例子* - 可以通過添加一個選項來「固定」*智能文本編輯器*(可以對您的解決方案的現有類進行實時分析):當您創建它建議構造函數調用基礎構造函數。 – ToolmakerSteve