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

man*_*llt 11 .net vb.net constructor class

我是开发人员,没有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
Run Code Online (Sandbox Code Playgroud)

在第二个FooPresenter构造函数的代码我得到一个错误

"构造函数调用仅在实例构造函数的第一个语句中有效."

在:

            Me.New(true)
Run Code Online (Sandbox Code Playgroud)

如果我颠倒了订单,我会收到错误:

            MyBase.New(String.Empty)
Run Code Online (Sandbox Code Playgroud)

我可以创建一个方法SetValues(... parameters ...)并从两个构造函数中调用它,但有人知道一个解决方法以避免此错误吗?为什么编译器不会验证在重载之前调用基本构造函数的可能性构造函数?

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

M.A*_*nin 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
Run Code Online (Sandbox Code Playgroud)


ken*_*n2k 7

就像 with 一样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
Run Code Online (Sandbox Code Playgroud)