2009-04-25 2 views
39

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

ответ

51

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

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

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

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

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

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

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

+1

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

+1

Хорошее объяснение, но мне интересно, почему это невозможно. Это было бы легко разрешить. –

+1

Ссылка на документацию при нажатии теперь производит страницу с текстом «Visual Studio 2003 Retired Technical documentation». – JohnH

7

Параметрированные конструкторы нельзя унаследовать так же, как методы экземпляра. Вам нужно реализовать конструктор в дочернем классе, а затем вызвать конструктор родителя с помощью 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++:
c-superclass-constructor-calling-rules

+0

Благодарим за предложение. Я обновил код, как вы предлагали в visual studio, и я все равно получаю ту же ошибку компиляции. Я также обновил сообщение, чтобы другие увидели ваше предложение. Любые другие идеи? –

+0

Извините, я неправильно прочитал ваше сообщение. Цель состоит в том, чтобы наследовать новый метод, поэтому мне не нужно повторять код во всех моих дочерних классах.Как я могу получить доступ к новому методу в базовом классе без его кодирования в дочернем классе, как вы предложили. –

+0

Жозе, я редактировался для ясности. Мне не нужно реализовывать метод 1 в дочернем классе. Есть ли необходимость в реализации конструкторов в дочернем классе. Они не могут быть унаследованы напрямую? –

Смежные вопросы