VB.NET - вызов нескольких конструкторов - PullRequest
11 голосов
/ 29 декабря 2011

Я разработчик на AC # и не обладаю достаточным опытом в 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конструктор я получаю сообщение об ошибке

"Вызов конструктора действителен только при первом утверждении в конструкторе экземпляра."

at:

            Me.New(true)

Если я инвертирую порядок, то яполучить ошибку по адресу:

            MyBase.New(String.Empty)

Я могу создать метод SetValues ​​(... параметры ...) и вызвать его из двух конструкторов, но кто-то знает обходной путь, чтобы избежать этой ошибки? Почемукомпилятор не проверяет возможность вызова базового конструктора перед перегруженным конструктором?.

Кто-нибудь знает, как логически обосновать тот факт, что нельзя вызвать конструктор базового класса и другой конструктор уровня класса из одного класса?конструктор уровней одновременно?

Ответы [ 3 ]

17 голосов
/ 29 декабря 2011

Проблема в том, что после того, как вы укажете параметрический конструктор, конструктор без параметров станет приватным , если вы явно не укажете иное.

Итак, изменив код 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
4 голосов
/ 29 декабря 2011

Как и с 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 голосов
/ 29 декабря 2011

Вы не можете вызывать несколько конструкторов таким образом.Как и в C #, вы можете вызвать только один инициализатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...