Можете ли вы унаследовать sub новый (конструктор) с параметрами в VB? - PullRequest
41 голосов
/ 26 апреля 2009

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

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, но я нигде не могу найти его документированным. Если это необходимо, я хотел бы увидеть документацию.

Ответы [ 2 ]

56 голосов
/ 26 апреля 2009

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

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

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

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

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

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

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

7 голосов
/ 26 апреля 2009

Параметризованные конструкторы не могут наследоваться так же, как методы экземпляра. Вам необходимо реализовать конструктор в дочернем классе, а затем вызвать конструктор родителя, используя 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. Из того, что я могу извлечь, это определенно невозможно в C #, Java или C ++.

Вот еще один пост с тем же вопросом о C ++:
с-суперкласс-конструктор-колл-правила

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