我是一名c#开发人员,并没有体验过VB.NET。
情景:
Namespace Presenters
Public Class BaseFooPresenter
' assuming the public default parameterless constructor
Public Sub New(ByVal strvar As String)
' TODO with strvar variabile
End Sub
End Class
Public Class FooPresenter
Inherits BaseFooPresenter
Public Sub New(ByVal boolvar As Boolean)
' TODO with boolvar variabile
End Sub
Public Sub New(ByVal boolvar As Boolean, _
ByVal objvar As Object)
MyBase.New(String.Empty)
Me.New(true)
' TODO with objvar variabile
End Sub
End Class
End Namespace
在第二个FooPresenter构造函数中使用此代码时出现错误
“构造函数调用仅在实例构造函数的第一个语句中有效。”
在:
Me.New(true)
如果我反转订单,我会收到错误:
MyBase.New(String.Empty)
我可以创建一个方法SetValues(... parameters ...)并从两个构造函数中调用它,但是有人知道一个解决方法来避免这个错误吗?为什么编译器不验证调用基础构造函数的可能性在重载的构造函数之前?。
有人知道如何在逻辑上证明不可能同时从一个类级构造函数调用基类构造函数和另一个类级构造函数吗?
答案 0 :(得分:17)
问题在于,一旦指定参数构造函数,无参数构造函数将变为私有,除非您另有明确指定。
所以,修改ken2K的代码:
Namespace Presenters
Public Class BaseFooPresenter
' SPECIFYING the protected default parameterless constructor
' can also be public
Protected Sub New()
End Sub
Public Sub New(ByVal strvar As String)
' TODO with strvar variabile
End Sub
End Class
Public Class FooPresenter
Inherits BaseFooPresenter
Public Sub New(ByVal boolvar As Boolean)
MyBase.New()
' TODO with boolvar variabile
End Sub
Public Sub New(ByVal boolvar As Boolean, _
ByVal objvar As Object)
Me.New(boolvar)
' TODO with objvar variabile
End Sub
End Class
End Namespace
答案 1 :(得分:4)
与C#
一样,您无法同时拨打this()
和base()
。
这是你应该做的:
Namespace Presenters
Public Class BaseFooPresenter
' assuming the public default parameterless constructor
Public Sub New(ByVal strvar As String)
' TODO with strvar variabile
End Sub
End Class
Public Class FooPresenter
Inherits BaseFooPresenter
Public Sub New(ByVal boolvar As Boolean)
MyBase.New(String.Empty)
' TODO with boolvar variabile
End Sub
Public Sub New(ByVal boolvar As Boolean, _
ByVal objvar As Object)
Me.New(boolvar)
' TODO with objvar variabile
End Sub
End Class
End Namespace
答案 2 :(得分:2)
你不能像这样调用多个构造函数。就像在C#中一样,你只能调用一个初始化器。