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