你的假设是错误的;您的派生类的构造函数可以具有任何签名,只要他们使用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