Подтвердить что ты не робот

Можете ли вы наследовать дополнительный новый (конструктор) с параметрами в VB?

В приведенном ниже коде я получаю ошибку компиляции

Error Too many arguments to 'Public Sub New()'

на Dim TestChild As ChildClass = New ChildClass("c"). Я не получаю его на TestChild.Method1(), хотя они оба находятся в базовом классе, на который я наследую.

Public Class BaseClass
    Public ReadOnly Text As String
    Public Sub New(ByVal SetText As String)
        Text = SetText
    End Sub
    Public Sub New()
        Text = ""
    End Sub
End Class

Public Class ChildClass
    Inherits BaseClass
End Class

Public Class TestClass
    Sub Test()
        Dim TestChild As ChildClass = New ChildClass("c")
        TestChild.Method1()
    End Sub
End Class

Я могу изменить дочерний класс на:

Public Class ChildClass
    Inherits BaseClass
      Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Как предлагается ниже, но мне не нужно делать это для метода 1 или других унаследованных методов, и я ищу самый чистый код. Это может быть ограничение в системе с наследованием параметризованных операторов New, но я не могу найти его документально нигде. Если это необходимо, я хотел бы видеть документацию.

4b9b3361

Ответ 1

Поведение, которое вы видите, - "По дизайну". Классы для детей не имеют встроенных конструкторов из своих базовых типов. Детский класс отвечает за определение его собственных конструкторов. Кроме того, он должен гарантировать, что каждый конструктор, который он определяет, неявно или явно вызывает в конструкторе базового класса или цепочках другой конструктор того же типа.

Вам нужно будет определить один и тот же конструктор для всех дочерних классов и явно привязать его обратно к базовому конструктору через MyBase.New. Пример

Class ChildClass
  Inherits BaseClass
  Public Sub New(text As String)
    MyBase.New(text)
  End Sub
End Class

Документация, которую вы ищете, - это раздел 9.3.1 спецификации VB Language.

Я думаю, что наиболее подходящий раздел следующий (примерно начало второй страницы)

Если тип не содержит деклараций конструктора экземпляра, автоматически создается конструктор по умолчанию. Конструктор по умолчанию просто вызывает конструктор без параметров без прямого типа.

Это явно не указывает, что дочерний класс не будет наследовать конструкторы, но это побочный эффект инструкции.

Ответ 2

Параметрированные конструкторы нельзя унаследовать так же, как методы экземпляра. Вам нужно реализовать конструктор в дочернем классе, а затем вызвать родительский конструктор с помощью MyBase.

Public Class ChildClass
    Inherits BaseClass

    Public Sub New (ByVal SetText As String)
      MyBase.New(SetText)
    End Class
End Class

Public Class TestClass
  Public TestChild AS New ChildClass("c")
End Class

Это ограничение не является специфичным для VB. Из того, что я могу собрать, он определенно невозможен в С#, Java или С++.

Вот один связанный пост с тем же вопросом о С++:
c-superclass-constructor-calling-rules