VB.NET - 调用多个构造函数

时间:2011-12-29 11:02:07

标签: .net vb.net class constructor

我是一名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 ...)并从两个构造函数中调用它,但是有人知道一个解决方法来避免这个错误吗?为什么编译器不验证调用基础构造函数的可能性在重载的构造函数之前?。

有人知道如何在逻辑上证明不可能同时从一个类级构造函数调用基类构造函数和另一个类级构造函数吗?

3 个答案:

答案 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#中一样,你只能调用一个初始化器。